springboot--mybatis枚举自动转换实现

31 篇文章 0 订阅
24 篇文章 0 订阅

需求

数据传递过来的值是枚举的name;存储到数据库为code;查询出来,code化为name,给出去。

看图–查询

1数据

在这里插入图片描述

2枚举

在这里插入图片描述
在这里插入图片描述

3接口

在这里插入图片描述

3结果

在这里插入图片描述

看图–插入

在这里插入图片描述

数据库

在这里插入图片描述

代码实现

public class AutoEnumTypeHandler <E extends Enum<E>> extends BaseTypeHandler<E> {

    private BaseTypeHandler typeHandler;

    public AutoEnumTypeHandler(Class<E> enumType){
        if (enumType == null) {
            throw new IllegalArgumentException("枚举类型不能为空");
        }
        //判断两个类是不是父子关系
        if(IUserLevelEnum.class.isAssignableFrom(enumType)){
            System.out.println("数据库使用用户等级枚举自动转换");
            typeHandler = new UserLevelEnumTypeHandler(enumType);
        }else {
            System.out.println("数据库使用默认类型转换");
            typeHandler = new EnumTypeHandler<>(enumType);
        }
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
        typeHandler.setNonNullParameter(preparedStatement,i, e,jdbcType);
    }

    @Override
    public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return (E) typeHandler.getNullableResult(resultSet, s);
    }

    @Override
    public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return (E) typeHandler.getNullableResult(resultSet, i);
    }

    @Override
    public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return (E) typeHandler.getNullableResult(callableStatement, i);
    }
}
public class UserLevelEnumTypeHandler<E extends Enum<?> & IUserLevelEnum> extends BaseTypeHandler<IUserLevelEnum> {

    private Class<E> enumType;

    public UserLevelEnumTypeHandler(Class<E> enumType){
        if (null == enumType){
            throw new IllegalArgumentException("用户等级枚举类型不能为空");
        }
        this.enumType = enumType;
    }

    /**
     * 把Java类型的参数转换为对应的数据库类型
     * @param preparedStatement
     * @param i
     * @param baseEnum
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, IUserLevelEnum baseEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, baseEnum.getCode());
    }

    /**
     * 通过字段名称获取字段数据时,把数据库类型转换为对应的Java类型
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public IUserLevelEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int enumCode = resultSet.getInt(s);
        return resultSet.wasNull() ? null : valueConvert(enumCode);
    }

    /**
     * 通过字段索引获取字段数据时,把数据库类型转换为对应的Java类型
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public IUserLevelEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int enumCode = resultSet.getInt(i);
        return resultSet.wasNull() ? null : valueConvert(enumCode);
    }

    /**
     * 调用存储过程时,把数据库类型转换为对应的Java类型
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public IUserLevelEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int enumCode = callableStatement.getInt(i);
        return callableStatement.wasNull() ? null : valueConvert(enumCode);
    }

    private E valueConvert(int enumValue){
        try {
            return EnumUtil.convertEnumValue(enumType, enumValue);
        } catch (Exception ex) {
            throw new IllegalArgumentException("无法将枚举值" + enumValue + " 转换成 " + enumType.getSimpleName() + ",异常信息:", ex);
        }
    }
}
public class EnumUtil {

    /**
     * 枚举值转换
     * @param enumClass
     * @param enumCode
     * @param <E>
     * @return
     */
    public static <E extends Enum<?> & IUserLevelEnum> E convertEnumValue(Class<E> enumClass, int enumCode) {
        E[] enumConstants = enumClass.getEnumConstants();
        for (E e : enumConstants) {
            if (e.getCode() == enumCode)
                return e;
        }
        return null;
    }

}

demo已经写好,下载运行即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值