美文网首页Java 杂谈技术干货
【Mybatis】自定义类型处理器

【Mybatis】自定义类型处理器

作者: eejron | 来源:发表于2018-03-06 23:28 被阅读0次

    以前的做的项目数据字典都是在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
    

    相关文章

      网友评论

        本文标题:【Mybatis】自定义类型处理器

        本文链接:https://www.haomeiwen.com/subject/cljdfftx.html