MyBatis学习笔记——自定义TypeHandler(处理枚举)

默认TypeHandler处理枚举类型

EnumTypeHandler

EnumTypeHandler使用的是枚举的名字。
MyBatis学习笔记——自定义TypeHandler(处理枚举)_第1张图片

EnumOrdinalTypeHandler

EnumOrdinalTypeHandler使用的是枚举的索引。
MyBatis学习笔记——自定义TypeHandler(处理枚举)_第2张图片

自定义TypeHandler处理枚举类型

枚举类

//希望数据库保存的是100,200这些状态码,而不是默认的0,1索引或者枚举的名
public enum EmpStatus {
    LOGIN(100, "用户登录"), LOGOUT(200, "用户登出"), REMOVE(300, "用户不存在");

    private Integer code;
    private String msg;

    private EmpStatus(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    // 按照状态码返回枚举对象
    public static EmpStatus getEmpStatusByCode(Integer code) {
        switch (code) {
        case 100:
            return LOGIN;
        case 200:
            return LOGOUT;
        case 300:
            return REMOVE;
        default:
            return LOGOUT;
        }
    }
}

类型处理器

/**
 * 1. 实现TypeHandler接口,或者继承BaseTypeHandler
 */
public class MyEnumEmpStatusTypeHandler implements TypeHandler<EmpStatus> {

    /** 
     * 定义当前数据如何保存到数据库中
     */
    @Override
    public void setParameter(PreparedStatement ps, int i, EmpStatus parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.getCode().toString());
    }

    @Override
    public EmpStatus getResult(ResultSet rs, String columnName) throws SQLException {
        // 需要根据从数据库中拿到的枚举类型的状态码返回一个枚举对象
        int code = rs.getInt(columnName);
        System.out.println("从数据库中获取的状态码:" + code);
        return EmpStatus.getEmpStatusByCode(code);
    }

    @Override
    public EmpStatus getResult(ResultSet rs, int columnIndex) throws SQLException {
        int code = rs.getInt(columnIndex);
        System.out.println("从数据库中获取的状态码:" + code);
        return EmpStatus.getEmpStatusByCode(code);
    }

    @Override
    public EmpStatus getResult(CallableStatement cs, int columnIndex) throws SQLException {
        int code = cs.getInt(columnIndex);
        System.out.println("从数据库中获取的状态码:" + code);
        return EmpStatus.getEmpStatusByCode(code);
    }

}

注意,首先要继承BaseTypeHandler或者实现TypeHandler。
其次,编写对应的方法,一个是设置参数(setParameter)的方法,一个是获取结果(getResult)的方法。

配置

在全局配置文件中,添加如下代码:

    <typeHandlers>
        <typeHandler
            handler="com.shen.mybaties.typehandler.MyEnumEmpStatusTypeHandler"
            javaType="com.shen.mybaties.bean.EmpStatus" />
    typeHandlers>

(1)全局配置文件中配置全局的类型处理器
(2)也可以在处理某个字段的时候告诉MyBatis用什么类型处理器
1)保存:
MyBatis学习笔记——自定义TypeHandler(处理枚举)_第3张图片
2)查询:
MyBatis学习笔记——自定义TypeHandler(处理枚举)_第4张图片
查询的指定TypeHandler,需要在自定义封装规则的时候指定。

注意

在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。

你可能感兴趣的:(Mybatis)