• mybatis枚举类型处理器


    1. 定义枚举值的接口

    public abstract interface ValuedEnum {
        int getValue();
    }
    所有要被mybatis处理的枚举类继承该接口
    

    2. 定义枚举类型,并实现ValuedEnum接口

    public enum Gender implements ValuedEnum {
        UNKNOWN("保密", 0),
        MAIL("男", 1),
        FAMAIL("女", 2);
    
        private String name;
        private int value;
    
        Gender(String name, int value) {
            this.name = name;
            this.value = value;
        }
    
        public String getName() {
            return name;
        }
    
        @Override
        public int getValue() {
            return this.value;
        }
    }
    

    3. 继承mybatis的BaseTypeHandler抽象类

    @MappedTypes(value = { Gender.class })
    public class ValuedEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
        private final Map<Integer, E> map = new HashMap<>();
    
        public ValuedEnumTypeHandler(Class<E> type) {
            if (Objects.isNull(type)) {
                throw new IllegalArgumentException("Type argument cannot be null");
            }
            E[] enums = type.getEnumConstants();
            if (Objects.isNull(enums)) {
                throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
            }
            for (E e : enums) {
                ValuedEnum valuedEnum = (ValuedEnum) e;
                map.put(valuedEnum.getValue(), e);
            }
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
            ValuedEnum valuedEnum = (ValuedEnum) e;
            preparedStatement.setInt(i, valuedEnum.getValue());
        }
    
        @Override
        public E getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
            int i = resultSet.getInt(columnName);
            if (resultSet.wasNull()) {
                return null;
            } else {
                return map.get(i);
            }
        }
    
        @Override
        public E getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
            int i = resultSet.getInt(columnIndex);
            if (resultSet.wasNull()) {
                return null;
            } else {
                return map.get(i);
            }
        }
    
        @Override
        public E getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
            int i = callableStatement.getInt(columnIndex);
            if (callableStatement.wasNull()) {
                return null;
            } else {
                return map.get(i);
            }
        }
    }
    

    @MappedTypes注解表示ValuedEnumTypeHandler要处理的枚举类型

    4. 在mybatis的配置文件中配置ValuedEnumTypeHandler

    <typeHandlers>
            <typeHandler handler="com.example.ValuedEnumTypeHandler"/>
        </typeHandlers>
    
  • 相关阅读:
    SDOI 2009 HH的项链
    SDOI2012 longge的问题
    SDOI 2010 星际竞速
    SDOI2009 晨跑
    SDOI2008 仪仗队
    让我们来看一看C++ 三.表达式与运算符
    如何判断素数
    让我们来看一看C++ 一.对世界说你好
    币种校验的安全问题随笔
    Nodejs代码安全审计之YAPI
  • 原文地址:https://www.cnblogs.com/jecyhw/p/8045870.html
Copyright © 2020-2023  润新知