16、通用枚举类型处理(一)
来源:互联网 发布:网络优化塔工2017招聘 编辑:程序博客网 时间:2024/06/10 12:29
问题
如果一个项目中,有几十个,几百个,甚至更多的枚举类型怎么办?
如果遇到一个枚举类,写一个TypeHandle,这样的话,枚举类的处理器会剧增。
不仅如此,你会发现,枚举类的处理器几乎大同小异。
解决的思路
定义一个万能的枚举转换处理器,使用泛型实现
定义枚举接口
package com.lf;/** * Created by LF on 2017/6/12. */public interface BaseEnum<E extends Enum<?>, T> { T getCode(); String getName(); E of(String code);}
实现枚举接口,定义枚举
package com.lf.dict;import com.lf.BaseEnum;import lombok.ToString;import java.util.HashMap;import java.util.Map;/** * Created by LF on 2017/6/12. */@ToStringpublic enum Gender implements BaseEnum<Gender, Integer> { MAN(1, "男"), WOMAN(2, "女"); static Map<Integer, Gender> enumMap = new HashMap<>(); static { Gender[] values = Gender.values(); for (Gender value : values) { enumMap.put(value.getCode(), value); } } private Integer code; private String name; Gender(Integer code, String name) { this.code = code; this.name = name; } @Override public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } @Override public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Gender of(String code) { return enumMap.get(code); }}
定义万能枚举转换处理器
package com.lf.typehandle;import com.lf.BaseEnum;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.MappedJdbcTypes;import org.apache.ibatis.type.MappedTypes;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * Created by LF on 2017/6/12. */@MappedTypes(basePackage = {"com.lf.dict"})@MappedJdbcTypes(value = JdbcType.INTEGER, includeNullJdbcType = true)public class BaseEnumTypeHandle<E extends BaseEnum> extends BaseTypeHandler<E> { private Class<E> type; private E[] enums; /** * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现 * * @param type 配置文件中设置的转换类 */ public BaseEnumTypeHandle(Class<E> type) { if (type == null) throw new IllegalArgumentException("Type argument cannot be null"); this.type = type; this.enums = type.getEnumConstants(); Class<?>[] interfaces = type.getInterfaces(); for (Class<?> anInterface : interfaces) { Object[] enumConstants = anInterface.getEnumConstants(); }// this.enums = type.getGenericInterfaces(); 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 { //BaseTypeHandler已经帮我们做了parameter的null判断 ps.setObject(i, (String) parameter.getCode(), jdbcType.TYPE_CODE); } @Override public E getNullableResult(ResultSet rs, String columnName) throws SQLException { // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型 String i = rs.getString(columnName); if (rs.wasNull()) { return null; } else { // 根据数据库中的value值,定位PersonType子类 return locateEnumStatus(i); } } @Override public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型 String i = rs.getString(columnIndex); if (rs.wasNull()) { return null; } else { // 根据数据库中的value值,定位PersonType子类 return locateEnumStatus(i); } } @Override public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型 String i = cs.getString(columnIndex); if (cs.wasNull()) { return null; } else { // 根据数据库中的value值,定位PersonType子类 return locateEnumStatus(i); } } /** * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷 * * @param value 数据库中存储的自定义value属性 * @return value对应的枚举类 */ private E locateEnumStatus(String value) { for (E e : enums) { if (e.getCode().equals(value)) { return e; } } throw new IllegalArgumentException("未知的枚举类型:" + value + ",请核对" + type.getSimpleName()); }}
配置
<typeHandlers> <typeHandler handler="com.lf.typehandle.BaseEnumTypeHandle" javaType="com.lf.dict.Gender"/> </typeHandlers>
配置需要转换的字段
<resultMap id="BaseResultMap" type="com.lf.entity.Blog"> <id column="id" jdbcType="VARCHAR" property="id" /> <result column="title" jdbcType="VARCHAR" property="title" /> <result column="url" jdbcType="VARCHAR" property="url" typeHandler="com.lf.typehandle.BaseEnumTypeHandle"/> <result column="userid" jdbcType="VARCHAR" property="userid" /> </resultMap>
这样,我们就不需要为每一个枚举创建一个Handler去自动转换数据库中的枚举了。
仅是这样的话和org.apache.ibatis.type.EnumOrdinalTypeHandler
就没有什么区别了,我们写这个类就完全没有必要了
阅读全文
0 0
- 16、通用枚举类型处理(一)
- 17、通用枚举类型处理(二)
- 通用的枚举类型
- 15、处理枚举类型
- mybatis处理枚举类型
- Mybatis处理枚举类型
- Java枚举类型(一)
- 对枚举类型的处理
- Java-枚举类型处理判断
- Swift中的枚举类型(一)
- 枚举类型应用(一)
- spring boot集成mybatis,枚举类型字段注册通用
- Python--枚举类型和异常处理
- mybatis TypeHandler处理自定义枚举类型
- 黑马训营练--枚举类型(一)
- UPMS通用用户权限系统——添加枚举类型的用户属性,获取枚举值
- 枚举类型
- 枚举类型
- 初识数据挖掘
- svn设置提交忽略某些文件或文件夹
- java多线程
- 15、处理枚举类型
- SSH框架学习笔记(1)
- 16、通用枚举类型处理(一)
- zookeeper原理详解
- MySQL的多表联合查询
- 17、通用枚举类型处理(二)
- C头文件包含
- JAVA面向对象2:构造方法和this关键字
- 什么是信用利差
- Java简介
- hamming distance