mybatis:字段默认值是空串,对应类为枚举类ValidStatus

mybatis 字段默认值是空串,对应字段为枚举类ValidStatus, 查询时报 No enum constant com...ValidStatus.

请问, 能忽略掉空串, 直接将ValidStatus字段值转为null吗?

阅读 4.2k
1 个回答

mybatis默认的枚举类型处理器
EnumTypeHandler
mybatis的默认枚举类型处理器,将枚举类型的name持久化到数据库;

EnumOrdinalTypeHandler
mybatis原生支持的另一种枚举类型处理器,将枚举类型的索引序号持久化到数据库,需要全局配置或者在需要的字段上单独配置;

mybatis在3.4.5及之后版本中,新增了一个指定全局默认枚举类型处理器的配置项;
在mybatis-config.xml中添加如下配置即可使自定义处理器全局生效,解决了之前新增枚举都需要单独配置的烦恼;

<configuration>
    <settings>
        <!--指定 Enum 使用的默认 TypeHandler (新增于 3.4.5)-->
        <setting name="defaultEnumTypeHandler" value="com.xxx.demo.enum.SelfDefineEnumTypeHandler"/>
    </settings>
    <!-- 其他配置省略 -->

默认枚举处理器的处理方式:
org.apache.ibatis.type.EnumTypeHandler#getNullableResult(java.sql.ResultSet, java.lang.String):

 @Override
 public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
      String s = rs.getString(columnName);
      return s == null ? null : Enum.valueOf(type, s);
 }

上边, s 为 null 时, 就会调用 Enum.valueOf() 方法, 将 s 转化为相应的枚举值。 可是 ,数据库中定义字符串字段时,通常不会将默认值设置为 null, 而是会设置为空串,这样, 空串不能转化为枚举值, 就会报

throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);

的异常。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题