枚举处理器——Mybatis提供的枚举处理器(基础)
在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());//这里Enabled.enabled值拿到枚举值为enabled对应的value 为1 ,比较两者值是否相同
role.setEnabled(Enabled.disabled);//这里Enabled.disabled值拿到枚举值为disabled对应的value为0
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,更新成功。