java mybatis enum_mybatis处理枚举类的简单方法
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处理枚举类的简单方法相关推荐
- Java学习总结3——枚举类和反射机制
Java枚举类和反射机制 一.Java枚举类(Enum): 在某些情况下,一个类的对象是有限且固定的,对于这种对象的实例有限且固定的类,在 Java 中被称为枚举类(Enum):枚举类是为了提高代码可 ...
- Java中Date和Calender类的使用方法
查看文章 Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...
- 枚举类的value方法
枚举类的value()方法可以将枚举类转变为一个枚举类型的数组,是由编译器添加的 官网 如图
- java string转enum_java枚举类Enum方法简介(valueof,value,ordinal) (转)
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口. 当我们在声明一个enum类型时,我们应该注意到en ...
- Java中的enum枚举类
首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...
- 【Java】6.9 枚举类
目录 枚举类简介 实现枚举类 枚举类的成员变量.方法和构造器 枚举类简介 [什么是枚举类?] 枚举类就是实例有限且固定的类.且在定义时,枚举类要在第一行全部列出 [为什么要是用枚举类?] 使用枚举类可 ...
- [ 转载 ] Java基础10--关于Object类下所有方法的简单解析
关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...
- java集合,多线程,面向对象,枚举类,异常等所有常用的方法总和
extends //继承 Instanceof //多态里面的比较是否new 的对象为他 abstract //抽象类 final // 不可修改,最终的 如果在类前面加那么表示此类不可以被继承 st ...
- Java学习笔记day7——枚举类练习、包装类、抽象类、接口
1. 枚举类的常用方法 (1)String name():返回枚举常量对象名称 (2)int ordinal():返回常量对象的下标 (3)String toString():Enum父类又重写了Ob ...
最新文章
- 学生用计算机2ndf,手机计算器2ndf键在哪 等同于INV键
- 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
- c#部分---递归题目;猴子摘桃
- crtmpserver 配置说明_crtmpserver流媒体服务器的介绍与搭建
- 如下为利用Linux内核链表创建,Linux内核中链表的实现与应用
- 求矩阵特征值的方法和性质
- JavaScript 常用技巧收集
- Git的学习笔记(一)
- 移动硬盘格式化了?可以这样恢复数据
- opencv实践中遇到的问题
- python中[:, 0]是什么意思
- 什么是数据中台系统 - whale帷幄
- Android APP调起小程序
- 关于防止表单重复提交
- 2020.2.26 数学函数(吃苹果问题)
- 从差等生到研究员:一位农村孩子的奋斗独白 | 治学大家谈
- MATLAB colorbar颜色红黄绿,Matlab获取colorbar颜色并转换为需要的CPT文件
- 使用树莓派+arduino+采集卡+frp实现异地控制电视机顶盒
- 升级鸿蒙系统无法连接服务器,鸿蒙安装了描述文件检测不到更新怎么办?鸿蒙安装包验证失败怎么解决?...
- SiC and GaN vs. IGBTs争夺霸权,迫在眉睫的拔河比赛