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与Spring集成的SqlSessionFactoryBean
Mybatis异常--java.lang.IllegalArgumentException: NO ENUM const class org.apache.ibatis.type.JdbcType.i