前言
在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载。
解决
内置枚举转换器
MyBatis内置了两个枚举转换器分别是:org.apache.ibatis.type.EnumTypeHandler
和 org.apache.ibatis.type.EnumOrdinalTypeHandler
。
EnumTypeHandler
mybatis 中默认的枚举转换器,是获取枚举中的 name
属性。
EnumOrdinalTypeHandler
获取枚举中 ordinal
属性,就是例如索引一样的东西,不过是从 1 开始递增的。
因此上面提供的两种的转换器都不能满足我们的需求,我们需要自定义一个转换器。
自定义枚举转换器
MyBatis提供了 org.apache.ibatis.type.BaseTypeHandler
类用于我们自己扩展类型转换器,上面的EnumTypeHandler和EnumOrdinalTypeHandler
也都实现了这个接口。
继承 BaseTypeHandler<T>
一共需要实现4个方法:
1. void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型;
2. T getNullableResult(ResultSet rs, String columnName)
用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型;
3. T getNullableResult(ResultSet rs, int columnIndex)
用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型;
4. T getNullableResult(CallableStatement cs, int columnIndex)
用定义调用存储过程后,如何把数据库类型转换为对应的Java类型。
定义一个枚举通用行为
定义一个枚举通用行为,规范枚举的实现。
public interface BaseEnum<E extends Enum<?>, T> {
/**
* 获取枚举的值
* @return 枚举的值
*/
T getValue();
}
定义自己需要的枚举:
public class SysConstant {
/**
* 人员状态
*/
public enum SysUserStatus implements BaseEnum<SysUserStatus, String> {
/**
* 账户已经激活(默认)
*/
ACTIVE("1"),
/**
* 账户锁定
*/
LOCK("0");
private String value;
private SysUserStatus(String value) {
this.value = value;
}
@Override