第一步:定义顶级枚举接口

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;
}

@Override
public Integer getCode() {
return code;
}

@Override
public 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.");
}

@Override
public 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());
}

@Override
public 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());
}

@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 根据数据库存储类型决定获取类型
Integer i = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位enum子类
return locateEnumStatus(i);
}
}

@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 根据数据库存储类型决定获取类型
Integer i = rs.getInt(columnIndex);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位enum子类
return locateEnumStatus(i);
}
}

@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// 根据数据库存储类型决定获取类型
Integer i = cs.getInt(columnIndex);
if (cs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位enum子类
return locateEnumStatus(i);
}
}

@Override
public E getResult(ResultSet rs, String columnName) throws SQLException {
Integer i = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位enum子类
return locateEnumStatus(i);
}
}

@Override
public E getResult(ResultSet rs, int columnIndex) throws SQLException {
Integer i = rs.getInt(columnIndex);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位enum子类
return locateEnumStatus(i);
}
}

@Override
public 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的更多相关文章

  1. springboot~mybatis枚举映射

    在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,会把枚举的元素名称拼接到SQL语句里,而由于数据表是int类型, ...

  2. MyBatis 查询映射自定义枚举

    背景                  MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用         ...

  3. Mybatis 枚举类处理

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

  4. MyBatis XML 映射配置文件

    配置文件的基本结构 configuration —— 根元素 properties —— 定义配置外在化 settings —— 一些全局性的配置 typeAliases —— 为一些类定义别名 ty ...

  5. 六 mybatis高级映射(一对一,一对多,多对多)

    1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习.

  6. 【JAVA - SSM】之MyBatis输出映射

    MyBatis中的输出映射有两种:resultType和resultMap. 1.resultType 使用resultType进行结果映射时,只有当查询结果中有至少一列的名称和resultType指 ...

  7. MyBatis Generator自动生成MyBatis的映射代码

    MyBatis Generator大大简化了MyBatis的数据库的代码编写,有了一个配置文件,就可以直接根据表映射成实体类.Dao类和xml映射.资源地址:MyBatis项目地址:http://my ...

  8. Mybatis sql映射文件浅析 Mybatis简介(三)

    简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...

  9. Mybatis sql映射文件浅析 Mybatis简介(三) 简介

    Mybatis sql映射文件浅析 Mybatis简介(三)   简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...

随机推荐

  1. poj2912 Rochambeau

    Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is th ...

  2. Java内存原型分析

    Java虚拟机内存原型 寄存器:在程序中无法控制 栈:存放基本类型的数据和对象的引用,但是对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态 ...

  3. [2014-02-19]如何移除响应头中的.net framework 版本信息 以及mvc版本信息?

    先来看一个简单mvc3网站的响应头 修改Global.asax文件 在Application_Start方法中添加如下代码 MvcHandler.DisableMvcResponseHeader = ...

  4. [WPF]如何调试Data Binding

    前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding相关的内容, ...

  5. 常用Linux操作指令

    -------------------------------Linux目录------------------------------- /:根目录,一般根目录下只存放目录,在Linux下有且只有一 ...

  6. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

    简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...

  7. Microsoft Visual Studio 打开代码出现乱码解决方案

    在用VS编写代码时,文本的字符集可能和编译器的字符集不同,在这种情况下代码会显示出乱码. 解决办法: 在VS的工具->选项里面找到"文本编辑器",勾选“自动检测不带签名的UT ...

  8. ES6块级作用域

    块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...

  9. (3)ES6解构赋值-对象篇

    对象的解构赋值(可以不按顺序,但是key必须一样否则为undefined) //demo1 var {name,age} = { name: "Jewave", age:26 }; ...

  10. 转:面向切面编程AOP的理解

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...