自定义mybatis枚举转换,原理是如果用户没有定义自己的枚举转换工具,mybatis在解析枚举类时会自动获取mybatis的BaseTypeHandler,来转换枚举类,我们只需要重写这个枚举转换器,并将它指定为默认的转换器就好了

首先,定义一个通用接口BaseEnum:

import java.util.Arrays;
import java.util.Optional; public interface BaseEnum<T>{ T getDictKey(); default T getValue() {
return this.getDictKey();
} static <T> BaseEnum valueOfEnum(Class<BaseEnum> enumClass, T value){
if (value == null){
return null;
}
BaseEnum[] enums = enumClass.getEnumConstants();
Optional<BaseEnum> optional = Arrays.asList(enums).stream().filter(baseEnum -> baseEnum.getDictKey().equals(value)).findAny();
if (optional.isPresent()){
return optional.get();
}
throw new RuntimeException("未找到:" + value + "对应的" + enumClass.getName());
}
}

然后,定义一个枚举解析器MyEnumTypeHandler,该枚举类继承自BaseTypeHandler:

import com.bluepay.spring.mybatis.demo.BaseEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class MyEnumTypeHandler<T> extends BaseTypeHandler<BaseEnum<T>> {
private final Class<BaseEnum> type; public MyEnumTypeHandler(Class<BaseEnum> type) {
this.type = type;
} @Override
public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType) throws SQLException {
System.out.println("set value");
if (jdbcType == null) {
ps.setString(i, (String) parameter.getDictKey());
} else {
ps.setObject(i, parameter.getDictKey(), jdbcType.TYPE_CODE); // see r3589
}
} @Override
public BaseEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
return s == null ? null : BaseEnum.valueOfEnum(type, s);
} @Override
public BaseEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
return s == null ? null : BaseEnum.valueOfEnum(type, s);
} @Override
public BaseEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String s = cs.getString(columnIndex);
return s == null ? null : BaseEnum.valueOfEnum(type, s);
}
}

最后,将该枚举解析器配置为mybatis的默认枚举解析器,mybatis-config.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<typeHandlers>
<typeHandler handler="com.bluepay.spring.mybatis.config.MyEnumTypeHandler" javaType="com.bluepay.spring.mybatis.demo.BaseEnum"></typeHandler>
</typeHandlers> </configuration>

至此,默认的枚举转换类型定义完成,用户的枚举类只要实现BaseEnum接口,就可以被正确的解析了

最新文章

  1. 获取EMF文件内全部文字, 并按照左上到右下的顺序排序
  2. 用js写的极简的导航菜单,带下拉列表
  3. PHP易混淆函数的区分方法及意义
  4. SER SERVER存储过程
  5. Request获取信息总结
  6. Linux下的”锁“事儿
  7. Java多线程——&lt;一&gt;概述、定义任务
  8. mydumper原理4
  9. Git 技巧小结
  10. Excel.Application SaveAs 把excel转换为html
  11. 自定义分页标签,并使分页标签能获得url中的参数
  12. F - The Fun Number System(第二季水)
  13. 多玩YY聊天记录解析全过程
  14. wp7学习笔记
  15. DataSet 转 List
  16. android架构原理
  17. 打造自己Django博客日记
  18. 03-jQuery动画效果
  19. datagrid---columns列
  20. oracle 存储过程、游标参考实例

热门文章

  1. 前端移动端开发总结(Vue)
  2. Centos6安装破解Confluence6.3.1
  3. Atcoder arc093
  4. SQL关于:警告: 聚合或其他 SET 操作消除了空值。
  5. php高版本安装ecshop错误解决方法
  6. Delphi 方法:overload、override、virtual、dynamic、abstract
  7. 分布式项目spring 配置文件的约束
  8. Codeforces F. Bits And Pieces(位运算)
  9. PHP ftp_nlist() 函数
  10. Service3