mybatis优雅处理枚举类

  • 前言
  • 出现的问题:
  • 问题解决
  • EnumOrdinalTypeHandler
  • 使用EnumOrdinalTypeHandler
  • 测试
  • 注意的点:
  • 总结
  • 后续文章链接


前言

前两篇文章将和前段对接的问题处理了。
现在就到了本文的重头戏,枚举类如何优雅入库

本人在项目中使用的mybatis 3.5.9,其他版本应该影响不大
为了方便测试,当前枚举类中的值已初始化为

DISABLE(0,"禁用"),//ordinal=0
    ENABLE(1,"启用");//ordinal=1

出现的问题:

首个问题:是查询的时候,如果要查询枚举类的字段的值,传递枚举值时,会直接传递枚举值的名称,这样自然是查不到数据的

mysql枚举字段增加enum mybatis 枚举类型处理_mybatis

第二个问题:是mybatis封装结果集的时候,无法处理常量类型的枚举类

mysql枚举字段增加enum mybatis 枚举类型处理_枚举类_02

问题解决

这时候考虑到要用mybatis的类型处理类,也就是TypeHandler来处理了

不过查看mybatis的配置项,可以看到有这个一个内容

mysql枚举字段增加enum mybatis 枚举类型处理_mysql_03


原来mybatis是有做枚举类型的数据处理的

进到源码中看

mysql枚举字段增加enum mybatis 枚举类型处理_java_04


可以看到源码中对枚举类的处理方式是原值处理

EnumOrdinalTypeHandler

再翻看mybatis中的类型处理类,发现有这么一个类

org.apache.ibatis.type.EnumOrdinalTypeHandler

EnumOrdinal?,枚举排序值?

也就是说mybatis也提供了,根据排序值处理枚举类型的转换器

mysql枚举字段增加enum mybatis 枚举类型处理_枚举类_05

使用EnumOrdinalTypeHandler

先不管这么多,用上再说,mybatis-plus配置项需要注意一下

mysql枚举字段增加enum mybatis 枚举类型处理_mysql_06

测试

mysql枚举字段增加enum mybatis 枚举类型处理_mybatis_07


可以看到值已经正常封装进preparedStatement中了

注意的点:

mybatis只对preparedStatement调用typeHandler,如果是使用${ }设置sql参数,那么就不会走该处理器

值传递考虑此方式处理

mysql枚举字段增加enum mybatis 枚举类型处理_mysql枚举字段增加enum_08

总结

mybatis提供了org.apache.ibatis.type.EnumOrdinalTypeHandler 处理枚举类型的数据
如果在开发中,能强制所有枚举常量按序排列,并且值和odinal一致的,问题就已经解决了

后续文章链接