Mybatis枚举转换
2024-09-04 04:17:56
自定义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接口,就可以被正确的解析了
最新文章
- 获取EMF文件内全部文字, 并按照左上到右下的顺序排序
- 用js写的极简的导航菜单,带下拉列表
- PHP易混淆函数的区分方法及意义
- SER SERVER存储过程
- Request获取信息总结
- Linux下的”锁“事儿
- Java多线程——<;一>;概述、定义任务
- mydumper原理4
- Git 技巧小结
- Excel.Application SaveAs 把excel转换为html
- 自定义分页标签,并使分页标签能获得url中的参数
- F - The Fun Number System(第二季水)
- 多玩YY聊天记录解析全过程
- wp7学习笔记
- DataSet 转 List
- android架构原理
- 打造自己Django博客日记
- 03-jQuery动画效果
- datagrid---columns列
- oracle 存储过程、游标参考实例
热门文章
- 前端移动端开发总结(Vue)
- Centos6安装破解Confluence6.3.1
- Atcoder arc093
- SQL关于:警告: 聚合或其他 SET 操作消除了空值。
- php高版本安装ecshop错误解决方法
- Delphi 方法:overload、override、virtual、dynamic、abstract
- 分布式项目spring 配置文件的约束
- Codeforces F. Bits And Pieces(位运算)
- PHP ftp_nlist() 函数
- Service3