背景
之前ebean简单的 @DbEnumValue 注解就能支持通过value映射。
mybatis也有支持,是 @EnumValue注解。分别支持二种映射规则。
EnumOrdinalTypeHandler和EnumTypeHandler
EnumTypeHandler(默认)作用:
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (jdbcType == null) {
ps.setString(i, parameter.name());
} else {
ps.setObject(i, parameter.name(), jdbcType.TYPE_CODE); // see r3589
}
}
将枚举对象的name当成数据库value传入。
可以看到PreparedStatement
而EnumOrdinalTypeHandler则是将枚举对象的ordinal传入。
公司的枚举规则是name大写,value小写。这里自定义枚举映射规则
public class MyEnumTypeHandler<E extends Enum<E>> extends EnumTypeHandler<E> {
private final Class<E> type;
public MyEnumTypeHandler(Class type) {
super(type);
this.type=type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (jdbcType == null) {
ps.setString(i, parameter.name().toLowerCase());
} else {
// see r3589
ps.setObject(i, parameter.name().toLowerCase(), jdbcType.TYPE_CODE);
}
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
return s == null ? null : Enum.valueOf(type, s.toUpperCase());
}
}
然后apoll配置
亲测可用。
注意我这里的枚举类要求,name和value一样。但是name是大写,value是小写。偷个懒,懒得写反射。