mybatis处理枚举类的简单方法
mybatis自带对枚举的处理类
org.apache.ibatis.type.enumordinaltypehandler<e>
:该类实现了枚举类型和integer类型的相互转换。
但是给转换仅仅是将对应的枚举转换为其索引位置,也就是"ordinal()"方法获取到的值。对应自定义的int值,该类无能为力。
org.apache.ibatis.type.enumtypehandler<e>
:该类实现了枚举类型和string类型的相互转换。
对于想将枚举在数据库中存储为对应的int值的情况,该类没办法实现。
基于以上mybatis提供的两个枚举处理类的能力有限,因此只能自己定义对枚举的转换了。
自定义mybatis的枚举处理类enumvaluetypehandler
该类需要继承org.apache.ibatis.type.basetypehandler<e>
,然后在重定义的方法中实现自有逻辑。
import java.sql.callablestatement; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import org.apache.ibatis.type.mappedtypes; import org.apache.ibatis.type.basetypehandler; import org.apache.ibatis.type.jdbctype; /** * 处理实现了{@link esnbaseenum}接口的枚举类 * @author followtry * @time 2016年8月16日 下午8:06:49 * @since 2016年8月16日 下午8:06:49 */ //在 xml 中添加该 typehandler 时需要使用该注解 @mappedtypes(value = { qclisttypeenum.class, sellingqcbiztypeenum.class }) public class enumvaluetypehandler<e extends esnbaseenum> extends basetypehandler<e> { private class<e> type; private final e[] enums; public enumvaluetypehandler(class<e> type) { if (type == null) { throw new illegalargumentexception("type argument cannot be null"); } this.type = type; this.enums = type.getenumconstants(); if (this.enums == null) { throw new illegalargumentexception(type.getsimplename() + " does not represent an enum type."); } } @override public void setnonnullparameter(preparedstatement ps, int i, e parameter, jdbctype jdbctype) throws sqlexception { //获取非空的枚举的int值并设置到statement中 ps.setint(i, parameter.getvalue()); } @override public e getnullableresult(resultset rs, string columnname) throws sqlexception { int i = rs.getint(columnname); if (rs.wasnull()) { return null; } else { try { return getenumbyvalue(i); } catch (exception ex) { throw new illegalargumentexception( "cannot convert " + i + " to " + type.getsimplename() + " by ordinal value.", ex); } } } /** * 通过枚举类型的int值,获取到对应的枚举类型 * @author jingzz * @param i */ protected e getenumbyvalue(int i) { for (e e : enums) { if (e.getvalue() == i) { return e; } } return null; } @override public e getnullableresult(resultset rs, int columnindex) throws sqlexception { int i = rs.getint(columnindex); if (rs.wasnull()) { return null; } else { try { return getenumbyvalue(i); } catch (exception ex) { throw new illegalargumentexception( "cannot convert " + i + " to " + type.getsimplename() + " by ordinal value.", ex); } } } @override public e getnullableresult(callablestatement cs, int columnindex) throws sqlexception { int i = cs.getint(columnindex); if (cs.wasnull()) { return null; } else { try { return getenumbyvalue(i); } catch (exception ex) { throw new illegalargumentexception( "cannot convert " + i + " to " + type.getsimplename() + " by ordinal value.", ex); } } } }
该处理器是处理继承了esnbaseenum接口的枚举类,因为该接口中定义了获取自定义int值的方法。
如果在 mybatis 的 xml 中配置 该 typehandler,则需要添加注解@mappedtypes。在添加 typehandler 注册时使用具体的实现类注册。
配置文件如下:
<typealiases> <!-- 为自定义的 typehandler 指定别名,在 sql 的 xml 中即可使用别名访问了 --> <typealias type="cn.followtry.mybatis.enumvaluetypehandler" alias="enumvaluetypehandler"/> </typealiases> <typehandlers> <!--处理枚举的值转换--> <typehandler handler="cn.followtry.mybatis.enumvaluetypehandler"/> </typehandlers>
自定义的 enum 需要实现的接口
/** * @author jingzz * @time 2016年8月17日 上午9:22:46 * @since 2016年8月17日 上午9:22:46 */ public interface esnbaseenum { public int getvalue(); }
而实现了esnbaseenum的枚举示例如下:
/** * 同步的类型 * @author jingzz * @time 2016年8月3日 上午11:13:06 */ public enum synctype implements esnbaseenum { dept(3),//部门 person(1);//人员 private int value; private synctype(int value) { this.value = value; } @override public int getvalue(){ return this.value; } }
只有在实现了esnbaseenum的接口,enumvaluetypehandler才能通过接口的getvalue方法获取到对应枚举的值。
到此,对于枚举的简单处理逻辑已经实现完成了,接下来就是如何配置来使用该自定义枚举处理逻辑
配置对枚举的处理
首先,mybatis中对于处理逻辑的设置是在sql的映射文件中,如esnsynclogmapper.xml。
关键的设置枚举处理的位置如下:
<resultmap id="baseresultmap" type="com.test.dao.model.esnsynclog" > <id column="id" property="id" jdbctype="integer" /> <result column="sync_time" property="synctime" jdbctype="timestamp" /> <result column="total_num" property="totalnum" jdbctype="integer" /> <result column="success_total_num" property="successtotalnum" jdbctype="integer" /> <result column="type" property="type" typehandler="com.test.common.enumvaluetypehandler" /> <result column="msg" property="msg" jdbctype="varchar" /> </resultmap>
其中type列设置了属性typehandler,其值为自定义的枚举处理逻辑。
而在具体sql中也需要使用typehandler属性,如:
<if test="type != null" > #{type, typehandler=com.test.common.enumvaluetypehandler}, </if>
在mybatis处理到该位置时,就会调用typehandler指定的处理类来处理枚举类型。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。