mybatis自带对枚举的处理类

org.apache.ibatis.type.EnumOrdinalTypeHandler :该类实现了枚举类型和Integer类型的相互转换。

但是给转换仅仅是将对应的枚举转换为其索引位置,也就是"ordinal()"方法获取到的值。对应自定义的int值,该类无能为力。

org.apache.ibatis.type.EnumTypeHandler :该类实现了枚举类型和String类型的相互转换。

对于想将枚举在数据库中存储为对应的int值的情况,该类没办法实现。

基于以上mybatis提供的两个枚举处理类的能力有限,因此只能自己定义对枚举的转换了。

自定义mybatis的枚举处理类EnumValueTypeHandler

该类需要继承org.apache.ibatis.type.BaseTypeHandler ,然后在重定义的方法中实现自有逻辑。

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 extends BaseTypeHandler {

private Class type;

private final E[] enums;

public EnumValueTypeHandler(Class 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 注册时使用具体的实现类注册。

配置文件如下:

自定义的 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。

关键的设置枚举处理的位置如下:

其中type列设置了属性typeHandler,其值为自定义的枚举处理逻辑。

而在具体sql中也需要使用typeHandler属性,如:

#{type, typeHandler=com.test.common.EnumValueTypeHandler},

在mybatis处理到该位置时,就会调用typeHandler指定的处理类来处理枚举类型。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

java mybatis enum_mybatis处理枚举类的简单方法相关推荐

  1. Java学习总结3——枚举类和反射机制

    Java枚举类和反射机制 一.Java枚举类(Enum): 在某些情况下,一个类的对象是有限且固定的,对于这种对象的实例有限且固定的类,在 Java 中被称为枚举类(Enum):枚举类是为了提高代码可 ...

  2. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  3. 枚举类的value方法

    枚举类的value()方法可以将枚举类转变为一个枚举类型的数组,是由编译器添加的 官网 如图

  4. java string转enum_java枚举类Enum方法简介(valueof,value,ordinal) (转)

    Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口.   当我们在声明一个enum类型时,我们应该注意到en ...

  5. Java中的enum枚举类

    首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...

  6. 【Java】6.9 枚举类

    目录 枚举类简介 实现枚举类 枚举类的成员变量.方法和构造器 枚举类简介 [什么是枚举类?] 枚举类就是实例有限且固定的类.且在定义时,枚举类要在第一行全部列出 [为什么要是用枚举类?] 使用枚举类可 ...

  7. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析

    关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...

  8. java集合,多线程,面向对象,枚举类,异常等所有常用的方法总和

    extends //继承 Instanceof //多态里面的比较是否new 的对象为他 abstract //抽象类 final // 不可修改,最终的 如果在类前面加那么表示此类不可以被继承 st ...

  9. Java学习笔记day7——枚举类练习、包装类、抽象类、接口

    1. 枚举类的常用方法 (1)String name():返回枚举常量对象名称 (2)int ordinal():返回常量对象的下标 (3)String toString():Enum父类又重写了Ob ...

最新文章

  1. 学生用计算机2ndf,手机计算器2ndf键在哪 等同于INV键
  2. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
  3. c#部分---递归题目;猴子摘桃
  4. crtmpserver 配置说明_crtmpserver流媒体服务器的介绍与搭建
  5. 如下为利用Linux内核链表创建,Linux内核中链表的实现与应用
  6. 求矩阵特征值的方法和性质
  7. JavaScript 常用技巧收集
  8. Git的学习笔记(一)
  9. 移动硬盘格式化了?可以这样恢复数据
  10. opencv实践中遇到的问题
  11. python中[:, 0]是什么意思
  12. 什么是数据中台系统 - whale帷幄
  13. Android APP调起小程序
  14. 关于防止表单重复提交
  15. 2020.2.26 数学函数(吃苹果问题)
  16. 从差等生到研究员:一位农村孩子的奋斗独白 | 治学大家谈
  17. MATLAB colorbar颜色红黄绿,Matlab获取colorbar颜色并转换为需要的CPT文件
  18. 使用树莓派+arduino+采集卡+frp实现异地控制电视机顶盒
  19. 升级鸿蒙系统无法连接服务器,鸿蒙安装了描述文件检测不到更新怎么办?鸿蒙安装包验证失败怎么解决?...
  20. SiC and GaN vs. IGBTs争夺霸权,迫在眉睫的拔河比赛

热门文章

  1. 使用 qrcodejs 生成二维码的几个问题
  2. DDoS攻击走向应用层
  3. Redis (error) NOAUTH Authentication required.解决方法
  4. React学习(1)——JSX语法与React组件
  5. 制作生成静态页面的新闻系统
  6. 【MyBatis框架】MyBatis入门程序第一部分
  7. Oracle通过SSL方式连接AD服务器
  8. 利用ServletFileUpload组件上传文件
  9. 1231. The Embarrassed Cryptography
  10. MySQL常见面试题解析