介绍
这期内容当中小编将会给大家带来有关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 (Class enumClass整数值){ 如果(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来指定。