mybatis 枚举自动转换

背景:目前公司的一个SpringBoot项目,有一张表的一个字段需要存储枚举,之前保存的一直是枚举的code值,导致实体类的该属性是int类型,而不是枚举类型。技术领导希望我能解决这个问题,思路很简单,从网上找一下 “mybatis枚举自动转换”,应该不难。结果:但是看过大部分文章后,发现在 通用的自动转换 时,有点麻烦,大部分都建议枚举实现一个接口或在转换类中表明转换哪些枚举。经常仔细查看代码,...
摘要由CSDN通过智能技术生成

背景:

目前公司的一个SpringBoot项目,有一张表的一个字段需要存储枚举,之前保存的一直是枚举的code值,导致实体类的该属性是int类型,而不是枚举类型。技术领导希望我能解决这个问题,思路很简单,从网上找一下 “mybatis枚举自动转换”,应该不难。

结果:

但是看过大部分文章后,发现在 通用的自动转换 时,有点麻烦,大部分都建议枚举实现一个接口或在转换类中表明转换哪些枚举。经常仔细查看代码,根据我们项目的实际情况。编写出 枚举通用转换类,仅供参考。

废话不多说,直接上代码:

AutoEnumTypeHandler.class

package com.founderbn.common.mybatis.typeHandler;

import com.founderbn.common.mybatis.constants.EnumTransfer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class AutoEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
    private Class<E> type;

    public AutoEnumTypeHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        } else {
            EnumTransfer transfer = (EnumTransfer)type.getAnnotation(EnumTransfer.class);
            if (transfer == null) {
                throw new RuntimeException(type.getSimpleName() + " 没有使用@EnumT
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,我们可以使用TypeHandler来处理Java中的枚举类型与SQL中的映射关系。具体操作如下: 1. 创建一个实现了TypeHandler接口的枚举类型转换器类。 ``` public class MyEnumTypeHandler<E extends Enum<E>> implements TypeHandler<E> { private Class<E> type; public MyEnumTypeHandler(Class<E> type) { if (type == null) throw new IllegalArgumentException("Type argument cannot be null"); this.type = type; } @Override public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { ps.setNull(i, jdbcType.TYPE_CODE); } else { ps.setInt(i, parameter.ordinal()); } } @Override public E getResult(ResultSet rs, String columnName) throws SQLException { int ordinal = rs.getInt(columnName); if (rs.wasNull()) { return null; } else { try { Method method = type.getMethod("values"); Object[] objects = (Object[]) method.invoke(type); return (E) objects[ordinal]; } catch (Exception e) { throw new IllegalArgumentException("Cannot convert " + ordinal + " to " + type.getSimpleName() + " by ordinal value.", e); } } } @Override public E getResult(ResultSet rs, int columnIndex) throws SQLException { int ordinal = rs.getInt(columnIndex); if (rs.wasNull()) { return null; } else { try { Method method = type.getMethod("values"); Object[] objects = (Object[]) method.invoke(type); return (E) objects[ordinal]; } catch (Exception e) { throw new IllegalArgumentException("Cannot convert " + ordinal + " to " + type.getSimpleName() + " by ordinal value.", e); } } } @Override public E getResult(CallableStatement cs, int columnIndex) throws SQLException { int ordinal = cs.getInt(columnIndex); if (cs.wasNull()) { return null; } else { try { Method method = type.getMethod("values"); Object[] objects = (Object[]) method.invoke(type); return (E) objects[ordinal]; } catch (Exception e) { throw new IllegalArgumentException("Cannot convert " + ordinal + " to " + type.getSimpleName() + " by ordinal value.", e); } } } } ``` 2. 在MyBatis的配置文件中注册这个TypeHandler。 ``` <typeHandlers> <typeHandler handler="com.example.MyEnumTypeHandler" javaType="com.example.MyEnum"/> </typeHandlers> ``` 3. 在Java对象中使用枚举类型。 ``` public class User { private Long id; private String name; private Gender gender; // getter and setter } ``` 4. 在SQL语句中使用枚举类型。 ``` <select id="getUser" parameterType="long" resultType="com.example.User"> select * from user where id = #{id} </select> ``` 这样,MyBatis就会自动将数据库中的值转换为Java对象中的枚举类型,或者将Java对象中的枚举类型转换为数据库中的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值