默认TypeHandler处理枚举类型
EnumTypeHandler
EnumTypeHandler使用的是枚举的名字。
EnumOrdinalTypeHandler
EnumOrdinalTypeHandler使用的是枚举的索引。
自定义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)保存:
2)查询:
查询的指定TypeHandler,需要在自定义封装规则的时候指定。
注意
在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。