1. 定义枚举值的接口

public abstract interface ValuedEnum {
int getValue();
}
所有要被mybatis处理的枚举类继承该接口

2. 定义枚举类型,并实现ValuedEnum接口

public enum Gender implements ValuedEnum {
UNKNOWN("保密", 0),
MAIL("男", 1),
FAMAIL("女", 2); private String name;
private int value; Gender(String name, int value) {
this.name = name;
this.value = value;
} public String getName() {
return name;
} @Override
public int getValue() {
return this.value;
}
}

3. 继承mybatis的BaseTypeHandler抽象类

@MappedTypes(value = { Gender.class })
public class ValuedEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
private final Map<Integer, E> map = new HashMap<>(); public ValuedEnumTypeHandler(Class<E> type) {
if (Objects.isNull(type)) {
throw new IllegalArgumentException("Type argument cannot be null");
}
E[] enums = type.getEnumConstants();
if (Objects.isNull(enums)) {
throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
}
for (E e : enums) {
ValuedEnum valuedEnum = (ValuedEnum) e;
map.put(valuedEnum.getValue(), e);
}
} @Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
ValuedEnum valuedEnum = (ValuedEnum) e;
preparedStatement.setInt(i, valuedEnum.getValue());
} @Override
public E getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
int i = resultSet.getInt(columnName);
if (resultSet.wasNull()) {
return null;
} else {
return map.get(i);
}
} @Override
public E getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
int i = resultSet.getInt(columnIndex);
if (resultSet.wasNull()) {
return null;
} else {
return map.get(i);
}
} @Override
public E getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
int i = callableStatement.getInt(columnIndex);
if (callableStatement.wasNull()) {
return null;
} else {
return map.get(i);
}
}
}

@MappedTypes注解表示ValuedEnumTypeHandler要处理的枚举类型

4. 在mybatis的配置文件中配置ValuedEnumTypeHandler

<typeHandlers>
<typeHandler handler="com.example.ValuedEnumTypeHandler"/>
</typeHandlers>

mybatis枚举类型处理器的更多相关文章

  1. MyBatis 示例-类型处理器

    MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...

  2. mybatis 枚举类型使用

    一.首先定义接口,提供获取数据库存取的值得方法,如下: public interface BaseEnum { int getCode(); } 二.定义mybatis的typeHandler扩展类, ...

  3. Mybatis的类型处理器

    Mybatis在预处理语句(PreparedStatement)中设置一个参数时,会用默认的typeHandler进行处理. 这句话是什么意思呢,当你想用姓名查询一个人的信息时 <select ...

  4. MyBatis从入门到精通(十四):在MyBatis中使用类型处理器

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解在MyBatis中如何 ...

  5. mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))

    6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...

  6. Mybatis 枚举类处理

    目录 类型处理器(TypeHandler) 内置的枚举处理器 EnumTypeHandler源码 自定义枚举类处理 通用枚举处理器 Git 类型处理器(TypeHandler) 无论是 MyBatis ...

  7. Mybatis中使用自定义的类型处理器处理枚举enum类型

    知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...

  8. 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...

  9. MyBatis源码解析(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...

随机推荐

  1. MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)解决办法(来源网络)

    MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe) 启动的时候,报上述错误,从这个报错来看,多半是因为读取到了另外的my.cnf导致的 ...

  2. c# json字符串转数组

    JArray jo = (JArray)JsonConvert.DeserializeObject("这里是json字符串");

  3. python进阶11 正则表达式

    python进阶11 正则表达式 一.概念 #正则表达式主要解决什么问题? #1.判断一个字符串是否匹配给定的格式,判断用户提交的又想的格式是否正确 #2.从一个字符串中按指定格式提取信息,抓取页面中 ...

  4. Hdu1015&&寒假作业第二组I题

    题意是A-Z对应1-26,然后给个目标数字和字符串,看看字符串里的某5个字符的组合能不能使v - w^2 + x^3 - y^4 + z^5 = target等式成立,其实多写几个循环也可以达到目的, ...

  5. eclipse plugin

    快速查看目录 org.sf.easyexplore_1.0.4.jar mongo DB net.jumperz.app.MMonjaDB_1.0.16.jar jasper report jaspe ...

  6. python中cursor操作数据库(转)

    原文出处:http://doudouclever.blog.163.com/blog/static/175112310201284115340663/ python 操作数据库,要安装一个Python ...

  7. 解决win10下python3和python2共存pip的问题

    经过在查阅网友的各种经验,发现仍然解决不了问题,python2和python3在win10下的安装就不再演示了,直接在python的官网下载就好,我机器上使用的是python2.7.15和python ...

  8. mysql in和exists性能比较和使用

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用i ...

  9. 创建XML的用法

    注意:在实际开发中,注意createElement().createAttribute().createTextNode().appendchild()等方法的具体使用. // root根节点的属性数 ...

  10. PostgreSQL缓存

    目录[-] pg_buffercache pgfincore pg_prewarm dstat Linux ftools 使用pg_prewarm预加载关系/索引: pgfincore 输出: 怎样刷 ...