【Mybatis】自定义类型处理器
2018-03-06 本文已影响0人
eejron
以前的做的项目数据字典都是在DB中处理,现在的项目是直接使用的Java的枚举作为数据字典,但是总觉得现在的使用方式处理得不是很好,主要是枚举的ordinal的这个值严重依赖的定义枚举的顺序 ,及ordinal这个值不能自定义。所以根据自己的理解重新实现了一套。
public enum State {
enabled(0,"正常"),
disabled(1,"已注销"),
risk(100,"风险")
;
private final Integer value;
private final String display;
State( Integer value, String display) {
this.value = value;
this.display = display;
}
public Integer getValue() {
return value;
}
public String getDisplay() {
return display;
}
public static State getByValue(Integer value){
for(State state:State.values()){
if(state.value.equals(value)){
return state;
}
}
return null;
}
@Override
public String toString() {
return "State{" +
"name=" + name() +
",value=" + value +
", display='" + display + '\'' +
'}';
}
}
假如有一个用户实体类,里面有个State类型的成员变量,我们需要从数据库中查询出一个用户,数据库中state字段是int类型,那么我们直接使用Mybatis查询出来的数据并不会智能地将这个int值转换成相应的State;同样,当存在一个实体时将这个实体插入到DB中,也不会自动转换成int写入到DB,用户实体类如下:
public class User {
private Long id;
private String name;
private State state;
//省略getter、setter
}
那么,我们需要拓展Mybatis,自定义相应的类型处理器,Mybatis自己内置了很多类型处理器,比如:EnumOrdinalTypeHandler,EnumTypeHandler和LocalDateTimeTypeHandler等。简单解释下EnumOrdinalTypeHandler这个处理器主要做的是查询操作时将保存在DB的ordinal值转换成相应的枚举,同时写操作时将枚举类型的ordinal值写入DB。那么根据上述的说明,我们需要对State定义一个类型处理器,写操作时将State的value写入DB及查询将DB的value值转换成State。枚举处理器定义很简单,只需要继承BaseTypeHandler实现相应的方法逻辑即可,代码如下:
public class StateEnumTypeHandler extends BaseTypeHandler<State> {
//写操作时将获取State的value值
@Override
public void setNonNullParameter(PreparedStatement ps, int i, State parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i,parameter.getValue());
}
//后面这三个都是读操作时将value值转为相应的枚举
@Override
public State getNullableResult(ResultSet rs, String columnName) throws SQLException {
return State.getByValue(rs.getInt(columnName));
}
@Override
public State getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return State.getByValue(rs.getInt(columnIndex));
}
@Override
public State getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return State.getByValue(cs.getInt(columnIndex));
}
}
然后我们将这个类型处理器注入到Mybatis中即可,因为本人使用的是springboot,所以只需要在application.properties配置文件中添加如下配置,com.eejron.mybatis.typehandlers为类型处理器所在的包名
mybatis.type-handlers-package: com.eejron.mybatis.typehandlers