自定义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接口,就可以被正确的解析了

Mybatis枚举转换的更多相关文章

  1. mybatis枚举自动转换(通用转换处理器实现)

    https://blog.csdn.net/fighterandknight/article/details/51520595 https://blog.csdn.net/fighterandknig ...

  2. mybatis自定义枚举转换类

    转载自:http://my.oschina.net/SEyanlei/blog/188919 mybatis提供了EnumTypeHandler和EnumOrdinalTypeHandler完成枚举类 ...

  3. mybatis枚举映射成tinyint

    第一步:定义顶级枚举接口 public interface BaseEnum<E extends Enum<?>, T> { public T getCode(); publi ...

  4. mybatis 枚举类型使用

    一.首先定义接口,提供获取数据库存取的值得方法,如下: public interface BaseEnum { int getCode(); } 二.定义mybatis的typeHandler扩展类, ...

  5. mybatis 枚举typeHandler

    枚举typeHandler 在绝大多数情况下,typeHandler因为枚举而使用,MyBatis已经定义了两个类作为枚举类型的支持,这两个类分别是: •EnumOrdinalTypeHandler. ...

  6. Mybatis 枚举类处理

    目录 类型处理器(TypeHandler) 内置的枚举处理器 EnumTypeHandler源码 自定义枚举类处理 通用枚举处理器 Git 类型处理器(TypeHandler) 无论是 MyBatis ...

  7. (转)C# Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  8. C# Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  9. spring mvc4的日期/数字格式化、枚举转换

    日期.数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试: package com.cnblogs.yjmyzz.test; i ...

随机推荐

  1. JSP中调用Spring的方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. java格式化时间 String 转Date Date转String

    ---恢复内容开始--- 时间格式化 Date类型转换成String: Date date = new Date();SimpleDateFormat sdf = new SimpleDateForm ...

  3. 代理端口转发工具rinetd

    转载: https://my.oschina.net/wuweixiang/blog/2983280 rinetd 前言 iptables 的功能当然强大,但理解与设置却有点抽象,便通过google认 ...

  4. java des 加密/解密

    JAVA实现 加密 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 public byte[] desCrypto(byte[] datasource, String password) { ...

  5. h5判断设备是ios还是android

    var u = navigator.userAgent, app = navigator.appVersion;var isAndroid = u.indexOf('Android') > -1 ...

  6. Delphi 堆栈 [ heap(堆) 和 stack(栈) ]

    程序需要的内存空间分为 heap(堆) 和 stack(栈); heap(堆) 是自由存储区, stack(栈) 是自动存储区; 使用 heap 需要手动申请.手动释放, 使用 stack 是自动申请 ...

  7. bzoj1072题解

    [解题思路] 状压DP.f[i][j][k]表示当前DP到第i位,模d意义下余数为j,状态为k的方案数.其中状态k表示每个数字还剩多少个没取,状态数最多210. 于是有递推式转移方程:f[i+1][( ...

  8. mysql8.*忘记密码

    1.关闭mysql服务 2.打开cmd窗口,找到安装目录下的bin然后复制命令 mysqld --console --skip-grant-tables --shared-memory 3.再打开一个 ...

  9. mac 安装 pymssql 报错

    报错信息 _mssql.c:346:10: fatal error: 'sqlfront.h' file not found #include "sqlfront.h" ^~~~~ ...

  10. snmp相关网址

    https://blog.csdn.net/wangcg123/article/details/53837737 https://www.linuxidc.com/Linux/2012-05/6114 ...