mybatis枚举映射成tinyint
第一步:定义顶级枚举接口
public interface BaseEnum<E extends Enum<?>, T> {
public T getCode();public String getValue();
}
第二步:实现枚举接口
public enum AccountTypeEnum implements BaseEnum<AccountTypeEnum,Integer>{
PERSONAL(1,"PERSONAL"),ORGANIZATION(2,"ORGANIZATION");private Integer code;private String value;static Map<Integer,AccountTypeEnum> enumMap= new HashMap<>();static {for(AccountTypeEnum accountTypeEnum:AccountTypeEnum.values()) {enumMap.put(accountTypeEnum.getCode(),accountTypeEnum);}}private AccountTypeEnum(Integer code,String value) {this.code = code;this.value = value;}public void setCode(Integer code) {this.code = code;}public void setValue(String value) {this.value = value;}@Overridepublic Integer getCode() {return code;}@Overridepublic String getValue() {return value;}public static AccountTypeEnum getEnum(Integer code) {return enumMap.get(code);}
}
第三步:定义mybatis全局枚举处理器
public class UniversalEnumHandler<E extends BaseEnum> extends BaseTypeHandler<E> {
private Class<E> type;private E [] enums;/*** 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现* @param type 配置文件中设置的转换类*/public UniversalEnumHandler(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.");}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType)throws SQLException {//BaseTypeHandler已经做了parameter的null判断// ps.setObject(i,(Integer)parameter.getState(), jdbcType.TINYINT.TYPE_CODE);ps.setInt(i,(Integer)parameter.getCode());}@Overridepublic void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throwsSQLException {// ps.setObject(i,(Integer)parameter.getState(), jdbcType.TINYINT.TYPE_CODE);ps.setInt(i,(Integer)parameter.getCode());}@Overridepublic E getNullableResult(ResultSet rs, String columnName) throws SQLException {// 根据数据库存储类型决定获取类型Integer i = rs.getInt(columnName);if (rs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}@Overridepublic E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 根据数据库存储类型决定获取类型Integer i = rs.getInt(columnIndex);if (rs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}@Overridepublic E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {// 根据数据库存储类型决定获取类型Integer i = cs.getInt(columnIndex);if (cs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}@Overridepublic E getResult(ResultSet rs, String columnName) throws SQLException {Integer i = rs.getInt(columnName);if (rs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}@Overridepublic E getResult(ResultSet rs, int columnIndex) throws SQLException {Integer i = rs.getInt(columnIndex);if (rs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}@Overridepublic E getResult(CallableStatement cs, int columnIndex) throws SQLException {Integer i = cs.getInt(columnIndex);if (cs.wasNull()) {return null;} else {// 根据数据库中的code值,定位enum子类return locateEnumStatus(i);}}/*** 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷* @param value 数据库中存储的自定义value属性* @return value对应的枚举类*/private E locateEnumStatus(Integer value) {for(E e : enums) {if(e.getCode().equals(value)) {return e;}}throw new IllegalArgumentException("未知的枚举类型:" + value + ",请核对" + type.getSimpleName());}
}
第四步:在mybatis配置文件中添加typeHandler标签
<configuration>
<settings><!-- 开启驼峰自动映射 --><setting name="mapUnderscoreToCamelCase" value="true" /><!-- 二级缓存的总开关 --><setting name="cacheEnabled" value="false" /></settings>
<typeHandlers><typeHandler handler="moc.service.infrastructure.mybatis.UniversalEnumHandler"javaType="moc.commons.enums.AccountTypeEnum"/></typeHandlers>
<plugins><!-- 分页插件:com.github.pagehelper为PageHelper类所在包名 --><plugin interceptor="com.github.pagehelper.PageHelper"><!-- 方言 --><property name="dialect" value="mysql" /><!-- 该参数默认为false --><!-- 设置为true时,使用RowBounds分页会进行count查询,查询数据总条数 --><property name="rowBoundsWithCount" value="true" /></plugin><!-- 通用Mapper插件 --><plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"><!-- 主键自增回写方法,默认值MYSQL,详细说明请看文档 --><property name="IDENTITY" value="MYSQL" /><!--通用Mapper接口,多个通用接口用逗号隔开 --><property name="mappers" value="moc.persistence.mapper.base.SysMapper" /></plugin></plugins>
</configuration>
第五步:定义数据持久对象
@Table(name = "t_user")
public class UserPO implements Serializable {
private static final long serialVersionUID = -7508885998192627398L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "Mysql")private Integer id;private String userName;private String nickName;private String userPwd;private AccountTypeEnum accountType;private RoleTypeEnum userRole;private String idCard;private String phone;private String email;private String contacts;private String contactsPhone;private String address;private Timestamp updateTime;private Timestamp createTime;private Boolean isDel;
}
mybatis枚举映射成tinyint的更多相关文章
- springboot~mybatis枚举映射
在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,会把枚举的元素名称拼接到SQL语句里,而由于数据表是int类型, ...
- MyBatis 查询映射自定义枚举
背景 MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用 ...
- Mybatis 枚举类处理
目录 类型处理器(TypeHandler) 内置的枚举处理器 EnumTypeHandler源码 自定义枚举类处理 通用枚举处理器 Git 类型处理器(TypeHandler) 无论是 MyBatis ...
- MyBatis XML 映射配置文件
配置文件的基本结构 configuration —— 根元素 properties —— 定义配置外在化 settings —— 一些全局性的配置 typeAliases —— 为一些类定义别名 ty ...
- 六 mybatis高级映射(一对一,一对多,多对多)
1 订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习.
- 【JAVA - SSM】之MyBatis输出映射
MyBatis中的输出映射有两种:resultType和resultMap. 1.resultType 使用resultType进行结果映射时,只有当查询结果中有至少一列的名称和resultType指 ...
- MyBatis Generator自动生成MyBatis的映射代码
MyBatis Generator大大简化了MyBatis的数据库的代码编写,有了一个配置文件,就可以直接根据表映射成实体类.Dao类和xml映射.资源地址:MyBatis项目地址:http://my ...
- Mybatis sql映射文件浅析 Mybatis简介(三)
简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...
- Mybatis sql映射文件浅析 Mybatis简介(三) 简介
Mybatis sql映射文件浅析 Mybatis简介(三) 简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...
随机推荐
- poj2912 Rochambeau
Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is th ...
- Java内存原型分析
Java虚拟机内存原型 寄存器:在程序中无法控制 栈:存放基本类型的数据和对象的引用,但是对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态 ...
- [2014-02-19]如何移除响应头中的.net framework 版本信息 以及mvc版本信息?
先来看一个简单mvc3网站的响应头 修改Global.asax文件 在Application_Start方法中添加如下代码 MvcHandler.DisableMvcResponseHeader = ...
- [WPF]如何调试Data Binding
前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding相关的内容, ...
- 常用Linux操作指令
-------------------------------Linux目录------------------------------- /:根目录,一般根目录下只存放目录,在Linux下有且只有一 ...
- MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...
- Microsoft Visual Studio 打开代码出现乱码解决方案
在用VS编写代码时,文本的字符集可能和编译器的字符集不同,在这种情况下代码会显示出乱码. 解决办法: 在VS的工具->选项里面找到"文本编辑器",勾选“自动检测不带签名的UT ...
- ES6块级作用域
块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...
- (3)ES6解构赋值-对象篇
对象的解构赋值(可以不按顺序,但是key必须一样否则为undefined) //demo1 var {name,age} = { name: "Jewave", age:26 }; ...
- 转:面向切面编程AOP的理解
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...