处理枚举类型

若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选择一个来使用。

比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。

注意 EnumTypeHandler 在某种意义上来说是比较特别的,其它的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。

不过,我们可能不想存储名字,相反我们的 DBA 会坚持使用整形值代码。那也一样简单:在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形数值。

  1. <!-- mybatis-config.xml -->
  2. <typeHandlers>
  3. <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
  4. </typeHandlers>

但要是你想在一个地方将 Enum 映射成字符串,在另外一个地方映射成整形值呢?

自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理枚举类型, 所以如果我们想用普通的 EnumTypeHandler,就必须要显式地为那些 SQL 语句设置要使用的类型处理器。

(下一节才开始介绍映射器文件,如果你是首次阅读该文档,你可能需要先跳过这里,过会再来看。)

  1. <!DOCTYPE mapper
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="org.apache.ibatis.submitted.rounding.Mapper">
  5. <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap">
  6. <id column="id" property="id"/>
  7. <result column="name" property="name"/>
  8. <result column="funkyNumber" property="funkyNumber"/>
  9. <result column="roundingMode" property="roundingMode"/>
  10. </resultMap>
  11. <select id="getUser" resultMap="usermap">
  12. select * from users
  13. </select>
  14. <insert id="insert">
  15. insert into users (id, name, funkyNumber, roundingMode) values (
  16. #{id}, #{name}, #{funkyNumber}, #{roundingMode}
  17. )
  18. </insert>
  19. <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
  20. <id column="id" property="id"/>
  21. <result column="name" property="name"/>
  22. <result column="funkyNumber" property="funkyNumber"/>
  23. <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
  24. </resultMap>
  25. <select id="getUser2" resultMap="usermap2">
  26. select * from users2
  27. </select>
  28. <insert id="insert2">
  29. insert into users2 (id, name, funkyNumber, roundingMode) values (
  30. #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
  31. )
  32. </insert>
  33. </mapper>

注意,这里的 select 语句必须指定 resultMap 而不是 resultType