自定義mybatis枚舉轉換,原理是若是用戶沒有定義本身的枚舉轉換工具,mybatis在解析枚舉類時會自動獲取mybatis的BaseTypeHandler,來轉換枚舉類,咱們只須要重寫這個枚舉轉換器,並將它指定爲默認的轉換器就行了java
首先,定義一個通用接口BaseEnum:spring
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:sql
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配置以下:apache
<?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