在sys_role中存在一个属性叫做enabled,这个属性的作用是判断此角色状态是否在用,0代表禁用,1代表可用。但是在Sys_Role类中使用的Enabled类型是Integer,这种情况下需要手动校验Enabled值是否符合要求,当数值较少的时候处理起来还相对较为容易,但是数值复杂的时候处理起来就会变得十分的复杂,因此这里的Enabled值最好通过枚举的形式实现。
1. 首先在com.example.simple下创建type包,包下创建枚举类Enabled类:
package com.example.simple.type; public enum Enabled { disabled, //禁用 enabled; //启用 }
2. 修改SysRole类中enabled值:
/* * 有效标志 * */ private Enabled enabled; public Enabled getEnabled() { return enabled; } public void setEnabled(Enabled enabled) { this.enabled = enabled; }
3. 添加测试方法:
@Test public void testUpdateById(){ SqlSession sqlSession = getSqlSession(); try{ RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); //先查询出角色,然后修改角色得enabled值为disabled SysRole role = roleMapper.selectById(2L); Assert.assertEquals(Enabled.enabled,role.getEnabled()); role.setEnabled(Enabled.disabled); roleMapper.updateById(role); System.out.println("更新成功!"); roleMapper.selectById(2L); }finally { sqlSession.close(); } }
运行出现错误:
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'enabled' from result set. Cause: java.lang.IllegalArgumentException: No enum constant com.example.simple.type.Enabled.1
4. 这是因为在调用 Enabled.valueOf("1")的时候,枚举中没有1这个枚举值。因为在enabled被枚举赋值后,其下面的name和ordina也会相应被赋值,但是mybatis默认使用的org.apache.ibatis. type.EnumTypeHadler只能对枚举字面值进行处理,并不能完成name和ordinal等的赋值,所以这是需要在mybatis_config.xml中添加内容:
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.example.simple.type.Enabled"/> </typeHandlers>
这里一定要注意,每个标签有固定的顺序,嘤嘤嘤之前看书的时候没注意记导致加进去的时候configuration标签一直报红也不知道是哪的问题,最后复习了半天才知道是标签没放对,卒。
顺序如下:
properties>settings>typeAliases>typeHandlers>objectFactory>objectWrapperFactory>plugins>environments>mappers
这时再次运行,测试结果如下:
这里的enabled值已由1更为了0,更新成功。