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

  • 相关阅读:
    [Python] Array Attributes of Numpy lib
    《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.1 需求分析面面观
    UVA 10201 Adventures in Moving
    《史蒂夫·乔布斯传》官方正式中文版电子书(高清晰完整版)
    为什么要用BitSet
    sed 技巧一例:特定位置插入
    Mac+IPAD上使用wireshark抓包
    【经验谈】XmlSerializer的坑
    HTML语言简单回顾
    不可思议的每日培训(1)——日复一日的每日分享
  • 原文地址:https://www.cnblogs.com/canmeng-cn/p/10473274.html
Copyright © 2020-2023  润新知