中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

springboot~mybatis枚舉映射(she)

在mybatis和mybatis plus里,如果你的實體字段是一個枚舉類型,而在數據表里是整型,這時在存儲時需要進行處理,默認情況下,會把枚舉的元素名稱拼接(jie)到SQL語句(ju)里,而由于數據表是int類型,所以在插入(ru)等操(cao)作時,就(jiu)會出(chu)現(xian)異常!

添加枚舉處理器

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)

從(cong)上面結(jie)果中看到,我們的natural_born對應的值已經是int類型了,表示處理(li)器成功(gong)了!

枚舉轉換失敗總結

  1. 實體類上添加注解@TableName(autoResultMap = true)
  2. 實體的枚舉字段上,添加注解@TableField(typeHandler = UniversalEnumHandler.class)
  3. 配置文件添加mybatis-plus.typeHandlersPackage: com.pkulaw.sco.enums
posted @ 2019-09-05 17:04  張占嶺  閱讀(5624)  評論(2)    收藏  舉報