自定义类型处理器
自定义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}