mybatis的enum重构

Posted Montauk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis的enum重构相关的知识,希望对你有一定的参考价值。

有那么一种特殊情况, 我估计是数据库早已存在并运行, 现在要换用mybatis去做访问, 那么有些值, 比如男女, 比如种族, 甚至户籍, 都可以用enum枚举形式来当作字段.

这里拿账户的enable属性/字段做例子, 简单一点的情况是, disabled是0, enabled是1, 但是如果现有的数据库是反过来的, 或者其他的一些特殊情况, 需要自定义value顺序, 就需要建enum的同时, 也重写一个叫TypeHandler的类, 使用它, 让mybatis知道model数据的值与数据库值之间的一一对应(当然, 我们也可以把这活儿直接扔给前端的人, 让他们去折腾, 对吧, 但是作为一个全栈, 啥都要会点儿, 对吧).

首先是建一个enum叫Enalbed, 或者enable什么,都可以.

public enum Enabled {
    disabled(1), enabled(0);
    private final int value;

    private Enabled(int value) {
        this.value = value;
    }
    
    public int getValue() {
        return value;
    }
}

注意有个构造函数, 指明要将对应的整数值写到对应的字面值上去., 另外说一句, C里面的enum规则就很原始或说简单, 直接就是从0开始往上加的.

然后建handler类, 要实现一个接口:

public class EnabledNewTypeHandler implements TypeHandler<Enabled> {

    private final Map<Integer, Enabled> EnabledMap = new HashMap<Integer, Enabled>();

    public EnabledNewTypeHandler() {
        for (Enabled Enabled : Enabled.values()) {
            EnabledMap.put(Enabled.getValue(), Enabled);
        }
    }

    @Override
    public void setParameter(java.sql.PreparedStatement ps, int i, Enabled parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setInt(i, parameter.getValue());

    }

    @Override
    public Enabled getResult(ResultSet rs, String columnName) throws SQLException {
        Integer value = rs.getInt(columnName);
        return EnabledMap.get(value);
    }

    @Override
    public Enabled getResult(ResultSet rs, int columnIndex) throws SQLException {
        Integer value = rs.getInt(columnIndex);
        return EnabledMap.get(value);
    }

    @Override
    public Enabled getResult(CallableStatement cs, int columnIndex) throws SQLException {
        Integer value = cs.getInt(columnIndex);
        return EnabledMap.get(value);
    }

}

基本上就是把column值转成enum值

接着要改配置文件mybatis-config.xml

    <typeHandlers>
        <!-- 由于这里使用了新的Eabled的枚举,所以handler也要随之改改  -->
        <typeHandler javaType="marc.mybatis.lesson1.type.Enabled" handler="marc.mybatis.lesson1.type.EnabledNewTypeHandler" />
            
            <!-- <typeHandler 
            javaType="marc.mybatis.lesson1.type.Enabled" handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" 
            /> -->

    </typeHandlers>

下面注释掉的如果直接使用默认的顺序, 从0开始加的, 就直接用ibatis自带的handler就可以, 但是我们比较变态, 重写过, 在这个加上.

另外值得注意的是, 这个mybatis的配置文件, 各种配置的先后顺序是有讲究的,不能前后颠倒, 不然会编译不通过.

测试方法一并放这儿:

    @Test
    //这个测试用来测试将enable字段由int改成新的enum枚举类型EnabledNew
    //测试通过,数据已经插入
    public void testEnumNew() {
        SqlSession sqlSession = getSqlSession();
        try {
            SysRoleMapper sysRoleMapper = sqlSession.getMapper(SysRoleMapper.class);
            SysRole resultRole = sysRoleMapper.selectById(1L);
            System.out.println(resultRole);
            //接着再插入一条使用枚举类型创建的enable字段的数据
            SysRole sysRole = new SysRole();
            sysRole.setRoleName("测试用角色2");
            sysRole.setCreateBy(1L);
            sysRole.setCreateTime(new Date());
            sysRole.setEnabled(Enabled.disabled);
            int result = sysRoleMapper.insertRoleWithKeyReturn(sysRole);
            sqlSession.commit();
            System.out.println(result);
        } finally {
            sqlSession.close();
        }

    }

结果插入的记录, enable是1, 也就是Enable这个enum里面的disabled(1).

 

以上是关于mybatis的enum重构的主要内容,如果未能解决你的问题,请参考以下文章

重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

Mybatis-自定义Enum映射

Mybatis-自定义Enum映射

重构Mybatis与Spring集成的SqlSessionFactoryBean

Mybatis异常--java.lang.IllegalArgumentException: NO ENUM const class org.apache.ibatis.type.JdbcType.i

关于mybatis plus中手写sql查询enum