springboot~mybatis枚举映射

在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,会把枚举的元素名称拼接到SQL语句里,而由于数据表是int类型,所以在插入等操作时,就会出现异常!

添加枚举处理器

MappedTypes(value = {YesOrNo.class})
public class UniversalEnumHandler<E extends Enum<E> & BaseEnum> extends BaseTypeHandler<E> {

  private final Class<E> type;

  /**
   * construct with parameter.
   */
  public UniversalEnumHandler(Class<E> type) {
    if (type == null) {
      throw new IllegalArgumentException("Type argument cannot be null");
    }
    this.type = type;
  }

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType)
      throws SQLException {
    ps.setInt(i, parameter.getCode());
  }

  @Override
  public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
    int code = rs.getInt(columnName);
    return rs.wasNull() ? null : EnumUtils.codeOf(this.type, code);
  }

  @Override
  public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    int code = rs.getInt(columnIndex);
    return rs.wasNull() ? null : EnumUtils.codeOf(this.type, code);
  }

  @Override
  public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    int code = cs.getInt(columnIndex);
    return cs.wasNull() ? null : EnumUtils.codeOf(this.type, code);
  }
}

在配置文件指定处理器

mybatis-plus:
  typeHandlersPackage: cn.pilipa.account.cerebrum.client.enums #处理器所在包,我是把枚举处理器放在枚举包里

定义代表枚举键值的接口

public interface BaseEnum<E extends Enum<?>, T> {

  public Integer getCode();

  public String getText();
}

定义一下枚举

public enum YesOrNo implements BaseEnum {
  Yes(1, "是"),
  No(0, "否");
  private Integer code;
  private String text;

  YesOrNo(Integer code, String text) {
    this.code = code;
    this.text = text;
  }

  @JsonCreator
  public static YesOrNo jsonCreate(Integer code) {
    return EnumUtils.codeOf(YesOrNo.class, code);
  }

  @Override
  public Integer getCode() {
    return this.code;
  }

  @Override
  public String getText() {
    return this.text;
  }

  @JsonValue
  public Integer getCodeStr() {
    return this.code;
  }

}

在实体中定义枚举类型字段

  /**
   * 是否为国民.
   */
  private YesOrNo naturalBorn;

生成的SQL语句

 ==>  Preparing: INSERT INTO employee_info ( id, name, credit_number, status, first_time, tax_code, natural_born ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) 
2019-09-05 16:56:38.991 DEBUG [accounting-client,,,] 92833 --- [           main] c.p.a.c.c.m.EmployeeInfoMapper.insert    : 
==> Parameters: 1169534796253630466(Long), 段会涛(String), 130523199011111219(String), 1(Integer), 2019-09-05(Date), 130523199011111219(String), 0(Integer)

从上面结果中看到,我们的natural_born对应的值已经是int类型了,表示处理器成功了!

枚举转换失败总结

  1. 实体类上添加注解@TableName(autoResultMap = true)
  2. 实体的枚举字段上,添加注解@TableField(typeHandler = UniversalEnumHandler.class)
  3. 配置文件添加mybatis-plus.typeHandlersPackage: com.pkulaw.sco.enums
posted @   张占岭  阅读(5585)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2018-09-05 k8s~术语解释
2016-09-05 .NetCore~框架版本号不同引起dotnet不能run它
2016-09-05 Linux~centos上安装.netcore,HelloWorld归来!
2014-09-05 说说设计模式~桥梁模式(Bridge)
2013-09-05 知方可补不足~sqlserver中使用sp_who查看sql的进程
2013-09-05 知方可补不足~为千万级数据表加索引
2012-09-05 IoC~高效的Autofac
点击右上角即可分享
微信分享提示