Java 杂谈技术干货

【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
上一篇下一篇

猜你喜欢

热点阅读