Mybatis实战之自定义TypeHandler处理枚举

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

EnumTypeHandler: 用于保存枚举名

EnumOrdinalTypeHandler: 用于保存枚举的序号。

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

需求分析

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

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

自定义枚举TypeHandler 通用枚举DisplayedEnum public interface DisplayedEnum { String DEFAULT_VALUE_NAME = "value"; String DEFAULT_LABEL_NAME = "label"; default Integer getValue() { Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_VALUE_NAME); if (field == null) return null; try { field.setAccessible(true); return Integer.parseInt(field.get(this).toString()); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @JsonValue default String getLabel() { Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_LABEL_NAME); if (field == null) return null; try { field.setAccessible(true); return field.get(this).toString(); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } static <T extends Enum<T>> T valueOfEnum(Class<T> enumClass, Integer value) { if (value == null) throw new IllegalArgumentException("DisplayedEnum value should not be null"); if (enumClass.isAssignableFrom(DisplayedEnum.class)) throw new IllegalArgumentException("illegal DisplayedEnum type"); T[] enums = enumClass.getEnumConstants(); for (T t: enums) { DisplayedEnum displayedEnum = (DisplayedEnum)t; if (displayedEnum.getValue().equals(value)) return (T) displayedEnum; } throw new IllegalArgumentException("cannot parse integer: " + value + " to " + enumClass.getName()); } }

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

通过getValue()获取枚举值。

通过getLabel()获取枚举的label属性。

通过valueOfEnum()将Integer值转换为指定的枚举类型。

普通枚举类 public enum CommonsType implements DisplayedEnum { NORMAL("正常", 0), INVALID("无效", 1); String label; Integer value; private CommonsType(String label, Integer value) { this.label = label; this.value = value; } }

以上就是一个普通枚举类的示例。

自定义枚举TypeHandler @MappedJdbcTypes(value = JdbcType.TINYINT, includeNullJdbcType = true) public class DefaultEnumTypeHandler extends BaseTypeHandler<DisplayedEnum> { private Class<DisplayedEnum> type; public EnumTypeHandler(){}; public EnumTypeHandler(Class<DisplayedEnum> type) { if (type == null) throw new IllegalArgumentException("Type argument cannot be null"); this.type = type; } @Override public void setNonNullParameter(PreparedStatement ps, int i, DisplayedEnum parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter.getValue()); } @Override public DisplayedEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { return convert(rs.getInt(columnName)); } @Override public DisplayedEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return convert(rs.getInt(columnIndex)); } @Override public DisplayedEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return convert(cs.getInt(columnIndex)); } private DisplayedEnum convert(int status){ DisplayedEnum[] objs = type.getEnumConstants(); for(DisplayedEnum em: objs){ if(em.getValue() == status){ return em; } } return null; } } 使用我们自定义的DefaultEnumTypeHandler

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2b7f06546aeaddee34d7c2a5cbd4152d.html