mybatis 字段默认值是空串,对应字段为枚举类ValidStatus, 查询时报 No enum constant com...ValidStatus.
请问, 能忽略掉空串, 直接将ValidStatus字段值转为null吗?
###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);
的异常。