Mybatis中如何使用TypeHandler实现处理枚举

  介绍

这期内容当中小编将会给大家带来有关Mybatis中如何使用TypeHandler实现处理枚举,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>在Mybatis中,处理枚举类的TypeHandler有两个:

    <李> <李>

在实际项目中,以上往往不能满足我们的需求。

<强>需求分析

枚举需要包含两个属性,标签(用于显示),价值(实际的枚举值)。数据库保存枚举值(值).

这很明显Mybatis提供的两个枚举TypeHandler不能满足我们的需求。此时,我们可以自定义一个通用的枚举TypeHandler来满足我们的需求。

<>强自定义枚举TypeHandler

公共接口DisplayedEnum {
  字符串DEFAULT_VALUE_NAME=皏alue";
  字符串DEFAULT_LABEL_NAME=發abel";
  默认的整数getValue () {
  字段字段=ReflectionUtils.findField (this.getClass (), DEFAULT_VALUE_NAME);
  如果字段==null)
  返回null;
  尝试{
  field.setAccessible(真正的);
  返回Integer.parseInt (field.get(这).toString ());
  }捕捉(IllegalAccessException e) {
  把新的RuntimeException (e);
  }
  }
  @JsonValue
  默认字符串getLabel () {
  字段字段=ReflectionUtils.findField (this.getClass (), DEFAULT_LABEL_NAME);
  如果字段==null)
  返回null;
  尝试{
  field.setAccessible(真正的);
  返回field.get(这).toString ();
  }捕捉(IllegalAccessException e) {
  把新的RuntimeException (e);
  }
  }
  静态& lt; T扩展Enum比;T valueOfEnum (ClassenumClass整数值){
  如果(value=https://www.yisu.com/zixun/=空)
  把新IllegalArgumentException (“DisplayedEnum价值不应该为空”);
  如果(enumClass.isAssignableFrom (DisplayedEnum.class))
  把新IllegalArgumentException(“非法DisplayedEnum类型”);
  T[]枚举=enumClass.getEnumConstants ();
  (T T:枚举){
  DisplayedEnum DisplayedEnum=(DisplayedEnum) t;
  如果(displayedEnum.getValue () .equals(值))
  返回(T) displayedEnum;
  }
  把新的IllegalArgumentException(“不能解析整数:“+价值+”“+ enumClass.getName ());
  }
  }

普通枚举类通过实现DisplayedEnum接口,就可以:

    <李>通过getValue()获取枚举值。 <李>通过getLabel()获取枚举的标签属性。 <李>通过valueOfEnum()将整型值转换为指定的枚举类型。

 @MappedJdbcTypes (value=https://www.yisu.com/zixun/JdbcType.TINYINT, includeNullJdbcType=true)
  公开课DefaultEnumTypeHandler延伸BaseTypeHandler  {
  私人类类型;
  公共EnumTypeHandler () {};
  公共EnumTypeHandler(类类型){
  如果(type==null)把新IllegalArgumentException("类型参数不能为空");
  这一点。类型=类型;
  }
  @Override
  公共空间setNonNullParameter (PreparedStatement ps, int i, DisplayedEnum参数,JdbcType JdbcType)
  抛出SQLException {
  ps.setInt(我,parameter.getValue ());
  }
  @Override
  公共DisplayedEnum getNullableResult (ResultSet rs,字符串columnName) throws SQLException {
  返回转换(rs.getInt (columnName));
  }
  @Override
  公共DisplayedEnum getNullableResult (ResultSet rs, int columnIndex) throws SQLException {
  返回转换(rs.getInt (columnIndex));
  }
  @Override
  公共DisplayedEnum getNullableResult (CallableStatement cs, int columnIndex) throws SQLException {
  返回转换(cs.getInt (columnIndex));
  }
  私人DisplayedEnum转换(int状态){
  DisplayedEnum [] obj=type.getEnumConstants ();
  (DisplayedEnum em: obj) {
  如果(em.getValue()==状态){
  返回em;
  }
  }
  返回null;
  }
  }

由于Mybatis默认在处理枚举类型的时候会使用EnumTypeHandler(只保存及转换枚举类型的名字),因此,我们需要手动指定使用DefaultEnumTypeHandler。示例如下:

& lt; resultMap id=皒xx"类型=皒xx"比;   …   & lt;结果列=皌ype"jdbcType=癟INYINT"属性=皌ype"typeHandler=皒xx.xxx.xxx.DefaultEnumTypeHandler"/比;   …   & lt;/resultMap>

即我们需要通过使用typeHandler来指定。

Mybatis中如何使用TypeHandler实现处理枚举