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

浙公网安备 33010602011771号