枚举 enum

当使用枚举时,需要使用EnumTypeHandler或者EnumOrdinalTypeHandler作为映射类型,或者自己实现处理器。

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

需要注意的是EnumOrdinalTypeHandler只能处理特定的类型,当我们需要使用真正意义上的枚举,需要使用EnumTypeHandler或者自己实现。
实际上,对于增删改查都需要这么处理。

<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="funkyNumber" property="funkyNumber"/>
<result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
</resultMap>
<select id="getUser2" resultMap="usermap2">
select * from users2
</select>
<insert id="insert2" parameterType="org.apache.ibatis.submitted.rounding.User">
    insert into users2 (id, name, funkyNumber, roundingMode) values (
    #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
    )
</insert>

当然,mybatis默认已经指定了枚举处理器就是EnumTypeHandler,所以可以不予配置。只要类型设置成了enum。


再看EnumTypeHandler的实现,
当从数据读取值的时候
是通过Enum.valueOf来解析的,这是一种全字匹配的实现方式。

String s = cs.getString(columnIndex);
    return s == null ? null : Enum.valueOf(type, s);

如假设
public enum Enum1 {
ONE, TWO, THREE;
}
那么只有当cs.getString(columnIndex); = ONE的时候,才能获取到枚举值ONE;

设置值的时候
ps.setString(i, parameter.toString());

通过toString来处理。

还需要注意的是
EnumTypeHandler
Enumeration类型
VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

猜你喜欢

转载自liyixing1.iteye.com/blog/1989281