首发于:http://www.meibug.net/service/105.html
框架SpringBoot MyBatis TypeHandler
主要使用mybatis中的TypeHandler接口
在java中使用如下枚举:
public enum Status {
DELETED(-1, "已删除"),
NORMAL(1, "正常");
private final int code;
private final String text;
public int code() {
return code;
}
public String text() {
return text;
}
}
java中的entity:
public class DemoEntity{
private Long id;
private String name;
private Integer status;
}
如果我在java中使用枚举不用处理的情况下,存入到数据之前需要手动使用Status.code()获取到枚举的code,然后放入entity,才能获取通过mybatis存入数据库
如果我想在DemoEntity 中直接使用Status枚举,而且mybaits还能够正常存入,这个时候就需要用的TypeHandler
mybaits的相关资料:
http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
首先把entity修改为:
public class DemoEntity{
private Long id;
private String name;
private Status status;
}
然后创建一个handler实现TypeHandler接口,注意类上方的注解
@MappedTypes(value = Status.class) 这个一定要加
@MappedTypes(value = Status.class)
public class StatusHandler implements TypeHandler<Status> {
@Override
public Status getResult(ResultSet rs, String column) throws SQLException {
return Status.codeOf(rs.getInt(column));
}
@Override
public Status getResult(ResultSet rs, int i) throws SQLException {
return Status.codeOf(rs.getInt(i));
}
@Override
public Status getResult(CallableStatement cs, int i) throws SQLException {
return Status.codeOf(cs.getInt(i));
}
@Override
public void setParameter(PreparedStatement ps, int i, Status param, JdbcType jdbcType) throws SQLException {
ps.setByte(i, (byte)param.code());
}
}
因为我使用的是SpringBoot 所有我在springboot 中的properties文件中添加mybatis.type-handlers-package属性
mybatis.type-handlers-package=你的handler所在的包
测试一下:插入和查找都OK