【笔记】Mybatis高级查询(准备)
【笔记】Mybatis高级查询(一)–使用自动映射处理一对一关系
【笔记】Mybatis高级查询(二)–使用resultMap配置一对一映射
【笔记】Mybatis高级查询(三)–使用标签实现嵌套查询及延迟加载
【笔记】Mybatis高级查询(四)–使用resultMap的标签实现一对多和多对多查询
【笔记】Mybatis高级查询(五)–使用resultMap的进行嵌套查询及延迟加载
【笔记】Mybatis高级查询(小结)–嵌套查询及延迟加载
【笔记】Mybatis高级查询(六)–鉴别器discrimiator的使用
【笔记】Mybatis高级查询(七)–存储过程调用
【笔记】Mybatis高级查询(九)–Mybatis代码生成器的使用
【笔记】Mybatis高级查询(十)–Mybatis缓存使用
在sys_role中有一个字段enabled,只有2个可选值,0-禁用,1-启用。在SysRole中使用了Integer enabled来定义,这种情况下必须手动校验enabled的值是否符合要求,在只有2个值的时候处理比较容易,但当值很多的时候,处理就比较麻烦。这时候就要使用Mybatis的枚举处理器。
Mybatis提供了2个枚举处理器:org.apache.ibatis.type.EnumTypeHandler和org.apache.ibatis.type.EnumOrdinalTypeHandler
- EnumTypeHandler处理器只对枚举的字面值进行处理,是Mybatis默认使用的。
- EnumOrdinalTypeHandler处理器是使用枚举的索引进行处理的。
public enum Enabled {
disabled, // 禁用
enabled; // 启用
}
// 枚举用法
private Enabled enabled;
public Enabled getEnabled() {
return enabled;
}
public void setEnabled(Enabled enabled) {
this.enabled = enabled;
}
update sys_role
role_name = #{roleName,jdbcType=VARCHAR},
enabled = #{enabled,jdbcType=INTEGER},
create_by = #{createBy,jdbcType=BIGINT},
create_time = #{createTime,jdbcType=TIMESTAMP},
id = #{id}
where id = #{id}
/**
* 根据ID查询角色,枚举用法
* @param id
* @return
*/
SysRole selectById(Long id);
/**
* 根据ID更新角色,枚举用法
* @param id
* @return
*/
int updateById(SysRole role);
@Test
public void testUpdateById() {
// 获取SqlSession
SqlSession sqlSession = openSession();
try {
// 获取SysRoleMapper接口
SysRoleMapper roleMapper = sqlSession.getMapper(SysRoleMapper.class);
// 调用selectById方法
SysRole role = roleMapper.selectById(1L);
System.out.println(role);
System.out.println(role.getEnabled() + ":" + Enabled.enabled);
role.setEnabled(Enabled.disabled);
// 调用updateById方法
int row = roleMapper.updateById(role);
System.out.println(row);
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'enabled' from result set. Cause: java.lang.IllegalArgumentException: No enum constant ex.mybatis.rbac.type.Enabled.1
### The error may exist in ex/mybatis/rbac/mapper/SysRoleMapper.xml
### The error may involve ex.mybatis.rbac.mapper.SysRoleMapper.selectById
### The error occurred while handling results
### SQL: select id, role_name, enabled, create_by, create_time from sys_role where id = ?
### Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'enabled' from result set. Cause: java.lang.IllegalArgumentException: No enum constant ex.mybatis.rbac.type.Enabled.1
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
[ex.mybatis.rbac.mapper.SysRoleMapper.selectById] - ==> Preparing: select id, role_name, enabled, create_by, create_time from sys_role where id = ?
[ex.mybatis.rbac.mapper.SysRoleMapper.selectById] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysRoleMapper.selectById] - <== Columns: id, role_name, enabled, create_by, create_time
[ex.mybatis.rbac.mapper.SysRoleMapper.selectById] - <== Row: 1, 管理员, 1, 1, 2018-10-01 18:27:36.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectById] - <== Total: 1
SysRole [id=1, roleName=管理员, enabled=enabled, createBy=1, createTime=Mon Oct 01 18:27:36 CST 2018]
enabled:enabled
[ex.mybatis.rbac.mapper.SysRoleMapper.updateById] - ==> Preparing: update sys_role SET role_name = ?, enabled = ?, create_by = ?, create_time = ?, id = ? where id = ?
[ex.mybatis.rbac.mapper.SysRoleMapper.updateById] - ==> Parameters: 管理员(String), 0(Integer), 1(Long), 2018-10-01 18:27:36.0(Timestamp), 1(Long), 1(Long)
[ex.mybatis.rbac.mapper.SysRoleMapper.updateById] - <== Updates: 1
1