【MyBatis学习17】用typeHandlers处理enum类型

本文博客地址:http://blog.csdn.net/soonfly/article/details/67640580 (转载请注明出处)

如果想使用mybatis自带的枚举类处理,有2种方式,一个是EnumTypeHandler,一个是EnumOrdinalTypeHandler。
区别如下:

EnumTypeHandler直接存储name值。它是mybatis默认的枚举类型转换器。
EnumOrdinalTypeHandler存储enum类里的序号值,此时数据库表字段一般对应用smallint/int类型的处理。

使用的时侯很简单,在insert或者update语句块,或者resultMap字段等地方指定相应的typeHandler即可。

<insert id="insertUser" parameterType="User">
    insert into user(id,userName,status)
    values(#{id},  #{userName},#{status, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler})
</insert>

<resultMap id="BaseResultMap" type="User">
    <id column="id" property="userId" jdbcType="INTEGER" />
    <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>

不过大多数情况下,想存储的并不是枚举的顺序号,而是存储自定义的id值,这时我们就需要自己写enum的处理类。

若程序中原来有一个枚举类,name是长沙、株洲、湘潭三地,value采用身份证上的地区编号。

public enum CityTest {
    ChangSha(4301),Zhuzhou(4302),Xiangtan(4303);

    int value;
    private CityTest(int value){
        this.value=value;
    }
    public int getValue() {
        return this.value;
    }
    /*方法Value2CityTest是为了typeHandler后加的*/
    public static CityTest Value2CityTest(int value) {
        for (CityTest citytest : CityTest.values()) {
            if (citytest.value == value) {
                return citytest;
            }
        }
        throw new IllegalArgumentException("无效的value值: " + value + "!");
    }
}

根据上一章《【MyBatis学习16】自定义类型处理器typeHandlers介绍 》我们知道,在实现typeHandler时,需要用到两个方法
一个方法将javaType转成jdbcType,另一个方法将jdbcType转成javaType。

将javaType转成jdbcType我们可以用CityTest中的getValue(),获取当前CityTest对象的value值即可。
那么现在要增加一个方法,将jdbcType转成javaType(这样就定义了方法的入参和返回类型)。因此我们增加了Value2CityTest方法。

再定义转换器typeHandler的实现类:

public class CityTestTypeHandler extends BaseTypeHandler<CityTest> {
    @Override
    public CityTest getNullableResult(ResultSet rSet, String columnName)
            throws SQLException {
        return CityTest.Value2CityTest(rSet.getInt(columnName));
    }

    @Override
    public CityTest getNullableResult(ResultSet rSet, int columnIndex)
            throws SQLException {
        return CityTest.Value2CityTest(rSet.getInt(columnIndex));
    }

    @Override
    public CityTest getNullableResult(CallableStatement cStatement, int columnIndex)
            throws SQLException {
        return CityTest.Value2CityTest(cStatement.getInt(columnIndex));
    }

    @Override
    public void setNonNullParameter(PreparedStatement pStatement, int index,
            CityTest citytest, JdbcType jdbcType) throws SQLException {
        pStatement.setInt(index, citytest.getValue());
    }
}

接下来在myBatis配置文件中注册

<!-- 注册自定义类型处理器 -->
<typeHandlers>
    <typeHandler handler="twm.mybatisdemo.type.CityTestTypeHandler" />
</typeHandlers>

然后就可以使用了。

补充:

实际使用中并不一定要求显示声明
typeHandler=org.apache.ibatis.type.CityTestTypeHandler,系统会根据类型以及注册的typeHandler自动识别。

本文博客地址:http://blog.csdn.net/soonfly/article/details/67640580 (转载请注明出处)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值