Mybatis枚舉轉換


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM