自定义类型处理器

自定义TypeHandler处理枚举

mybatis处理枚举类型的时候有两个TypeHandler,一个是保存枚举的名字(默认),另一个是保存枚举的索引。但是我们往往希望保存一些我们自定义的东西,而不是这两个

例:创建一个枚举

/**
 * 希望数据库保存的是100, 200这些状态码,而不会默认的0, 1或者枚举名
 */
public enum EmployeeEnum {
    LOGIN(100, "已登录"), LOGOUT(200, "已下线"), REMOVE(300, "已被移除")
    ;
    private Integer code;
    private String msg;

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

    public static EmployeeEnum getEmployeeEnumByCode(Integer code) {
        switch (code) {
            case 100:
                return LOGIN;
            case 200:
                return LOGOUT;
            case 300:
                return REMOVE;
            default:
                return LOGOUT;
        }
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

自定义枚举处理类:继承TypeHandler,泛型里面写要处理的枚举类型

import com.jx.mbg.enums.EmployeeEnum;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class EmployeeTypeHandler implements TypeHandler<EmployeeEnum> {
    /**
     * 定义当前数据如何保存到数据库中
     * @param preparedStatement
     * @param i
     * @param employeeEnum
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, EmployeeEnum employeeEnum, JdbcType jdbcType) throws SQLException {
        // 将枚举的code设置进去
        preparedStatement.setString(i, employeeEnum.getCode().toString());
    }

    /**
     * 获取值,按照列名拿
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public EmployeeEnum getResult(ResultSet resultSet, String s) throws SQLException {
        // 需要根据从数据库拿到的枚举的状态码返回一个枚举对象,需要去对应的枚举对象中定义
        int anInt = resultSet.getInt(s);
        // 获取枚举对象
        return EmployeeEnum.getEmployeeEnumByCode(anInt);
    }

    /**
     * 获取值,按照索引拿
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public EmployeeEnum getResult(ResultSet resultSet, int i) throws SQLException {
        int anInt = resultSet.getInt(i);
        return EmployeeEnum.getEmployeeEnumByCode(anInt);
    }

    /**
     * 存储过程获取值
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public EmployeeEnum getResult(CallableStatement callableStatement, int i) throws SQLException {
        int anInt = callableStatement.getInt(i);
        return EmployeeEnum.getEmployeeEnumByCode(anInt);
    }
}

在全局配置中配置,告诉mybatis使用我们自定义的Typeandler处理枚举值

<typeHandlers>
    <!--
        handler:处理器全类名(这里是我们自定义的枚举类型处理器)
        javaType:要处理的对象(这里是我们自定义的枚举类型)
    -->
    <typeHandler handler="com.jx.mbg.typeHandler.EmployeeTypeHandler" javaType="com.jx.mbg.enums.EmployeeEnum"/>
</typeHandlers>

当然,也可以在查询的时候查询的时候指定,还记得#{}的其他作用吗,可以这样

#{empStatus, typeHandler=com.jx.mbg.typeHandler.EmployeeTypeHandler}

posted @ 2018-11-19 21:34  Jin同学  阅读(317)  评论(0)    收藏  举报