比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。不过,我们可能不想存储名字,相反我们的 DBA 会坚持使用整形值代码。那也一样轻而易举: 在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形数值。

    自动映射器(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.  
    5. <mapper namespace="org.apache.ibatis.submitted.rounding.Mapper">
    6. <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap">
    7. <id column="id" property="id"/>
    8. <result column="name" property="name"/>
    9. <result column="funkyNumber" property="funkyNumber"/>
    10. <result column="roundingMode" property="roundingMode"/>
    11. </resultMap>
    12. <select id="getUser" resultMap="usermap">
    13. select * from users
    14. </select>
    15. <insert id="insert">
    16. insert into users (id, name, funkyNumber, roundingMode) values (
    17. #{id}, #{name}, #{funkyNumber}, #{roundingMode}
    18. )
    19. </insert>
    20.  
    21. <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
    22. <id column="id" property="id"/>
    23. <result column="funkyNumber" property="funkyNumber"/>
    24. <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
    25. </resultMap>
    26. <select id="getUser2" resultMap="usermap2">
    27. select * from users2
    28. </select>
    29. <insert id="insert2">
    30. insert into users2 (id, name, funkyNumber, roundingMode) values (
    31. #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
    32. )
    33. </insert>
    34. </mapper>

    注意,这里的 select 语句强制使用 resultMap 来代替 resultType