mybatis枚举支持通过value映射

本文介绍如何在MyBatis中自定义枚举映射规则,以支持特定的枚举转换需求。通过继承`EnumTypeHandler`并覆盖其方法,可以实现将枚举名称转换为小写形式存入数据库,并从数据库读取时转换为对应的枚举对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景
之前ebean简单的 @DbEnumValue 注解就能支持通过value映射。
mybatis也有支持,是 @EnumValue注解。分别支持二种映射规则。
EnumOrdinalTypeHandler和EnumTypeHandler
EnumTypeHandler(默认)作用:

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
    if (jdbcType == null) {
      ps.setString(i, parameter.name());
    } else {
      ps.setObject(i, parameter.name(), jdbcType.TYPE_CODE); // see r3589
    }
  }

将枚举对象的name当成数据库value传入。
在这里插入图片描述
可以看到PreparedStatement
在这里插入图片描述

在这里插入图片描述
而EnumOrdinalTypeHandler则是将枚举对象的ordinal传入。
在这里插入图片描述

公司的枚举规则是name大写,value小写。这里自定义枚举映射规则

public class MyEnumTypeHandler<E extends Enum<E>> extends EnumTypeHandler<E> {
    private final Class<E> type;
    public MyEnumTypeHandler(Class type) {
        super(type);
        this.type=type;
    }
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        if (jdbcType == null) {
            ps.setString(i, parameter.name().toLowerCase());
        } else {
            // see r3589
            ps.setObject(i, parameter.name().toLowerCase(), jdbcType.TYPE_CODE);
        }
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String s = rs.getString(columnName);
        return s == null ? null : Enum.valueOf(type, s.toUpperCase());
    }
}

然后apoll配置

在这里插入图片描述
亲测可用。

注意我这里的枚举类要求,name和value一样。但是name是大写,value是小写。偷个懒,懒得写反射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值