Mybatis 结合枚举类型

本文详述MyBatis框架处理枚举类型的方法,包括默认的EnumTypeHandler及EnumOrdinalTypeHandler的使用,展示了如何在实体类、数据库表及XML映射文件中配置枚举类型。

前言

在使用 Mybitas 的时候我们一般很少关注数据库类型和 Java 类型转化这件事,其实 Mybatis 已经为我们做了这件工作,本文就枚举类型的使用进行一个小小的举例

typeHandler 类型处理器

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。

类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER 或未指定类型
EnumTypeHandlerEnumeration TypeVARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandlerEnumeration Type任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHAR or LONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE
枚举类型默认的 typeHandler

上文已经说到,Mybatis 为不同类型的参数自动设置来不通的类型处理器,对于枚举类型来说,默认的类型处理器就是 EnumTypeHandler,这样一来,其实我们可以直接使用枚举类型的参数,下面枚举类型的使用种的第一种情况就适用于这种默认情况。

Mybatis 结合枚举最简单的方式

我们需要先做点基础准备工作,简单说就是构造一个具有枚举类型成员变量的实体类,所以第一步自然是定义枚举类,考虑到枚举类型到多样化,我同时声明了3个枚举类

定义枚举类

一个属性一个枚举类就够了,这里展示三个枚举类是为类说明一下,默认情况下最终存到数据库到会是 枚举类型的名字 INIT

  • 第一个
public enum Str1Enum {
	INIT("初始状态"),
	ACTIVE("激活状态"),
	FREEZE("冻结状态");
	private String name;
	public String getName() {
		return name;
	}
	Str1Enum(String name){
		this.name=name;
	}
}
  • 第二个
public enum Str2Enum {
	
	INIT("init","初始化"),
	ACTIVE("active","激活"),
	FREEZE("freeze","冻结");
	
	private String key;
	private String value;
	public String getKey() {
		return key;
	}
	public String getValue() {
		return value;
	}
	Str2Enum(String key,String value){
		this.key=key;
		this.value=value;
	}
}
  • 第三个
public enum Str3Enum {
	INIT(10,"初始化"),
	ACTIVE(20,"激活"),
	FREEZE(30,"冻结");
	
	private int key;
	private String value;
	public int getKey() {
		return key;
	}
	public String getValue() {
		return value;
	}
	
	Str3Enum(int key,String value){
		this.key=key;
		this.value=value;
	}
}
准备一个表
create table ENUM_DEMO
(
	ID bigint not null
		primary key,
	STR1 varchar(32) null,
	STR2 varchar(32) null,
	STR3 varchar(32) null
);

在这里插入图片描述

最简单的方式

Mybatis+Maven 自动生成代码
Mybatis 自动生成代码配置 -Spring + Maven 环境

使用 Mybatis 默认的类型处理器,只需要在自动生成 Mybatis 相关内容的时候指定一下涉及字段的 javaType

<table tableName="ENUM_DEMO" domainObjectName="EnumDemoEntity" enableCountByExample="false"     
            enableDeleteByExample="false" enableSelectByExample="false"  enableUpdateByExample="false">
        	<columnOverride column="STR1" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str1Enum"></columnOverride>
        	<columnOverride column="STR2" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str2Enum"></columnOverride>
        	<columnOverride column="STR3" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str3Enum"></columnOverride>
        </table>
  • 向数据库插入一条数据
@Test
	public void test(){
		EnumDemoEntity record=new EnumDemoEntity();
		record.setId(1l);
		record.setStr1(Str1Enum.INIT);
		record.setStr2(Str2Enum.INIT);
		record.setStr3(Str3Enum.INIT);
		enumDemoEntityMapper.insert(record);
	}

在这里插入图片描述

使用 Mybatis 的 EnumOrdinalTypeHandler

上文提到,Mybatis 自带的枚举类型的类型处理器是 EnumTypehandler,其会保存枚举的名称,Mybatis 自带了另外一种枚举类型c处理器
EnumOrdinalTypeHandler,如上表中标红的部分,EnumTypeHandler 存储枚举的名称,EnumOrdinalTypeHandler 存储枚举的索引
如果需要使用这个枚举类型处理器,则需要额外做一些工作

类的路径
//EnumTypeHandler
org.apache.ibatis.type.EnumTypeHandler
//EnumOrdinalTypeHandler
org.apache.ibatis.type.EnumOrdinalTypeHandler
使用 EnumOrdinalTypeHandler 存储的是索引

需要修改数据库类型为 整形,而且EnumOrdinalTypeHandler 的起始数是0

create table ENUM_DEMO
(
	ID bigint not null
		primary key,
	STR1 varchar(32) null,
	STR2 varchar(32) null,
	STR3 int null
);
如果使用 Mybatis 代码自动生成工具
<table tableName="ENUM_DEMO" domainObjectName="EnumDemoEntity" enableCountByExample="false"     
            enableDeleteByExample="false" enableSelectByExample="false"  enableUpdateByExample="false">
        	<columnOverride column="STR1" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str1Enum"></columnOverride>
        	<columnOverride column="STR2" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str2Enum"></columnOverride>
        	<columnOverride column="STR3" jdbcType="VARCHAR" javaType="com.bestcxx.stu.springmybatis.enums.Str3Enum" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"></columnOverride>
        </table>
如果修改已有的 xml
  • 搜索的部分:指定 typeHandler
<resultMap id="BaseResultMap" type="com.bestcxx.stu.springmybatis.model.EnumDemoEntity" >
    <id column="ID" property="id" jdbcType="BIGINT" />
    <result column="STR1" property="str1" jdbcType="VARCHAR"/>
    <result column="STR2" property="str2" jdbcType="VARCHAR"/>
    <result column="STR3" property="str3" jdbcType="VARCHAR" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
  </resultMap>
  • 插入的部分:指定 typeHandler
<insert id="insert" parameterType="com.bestcxx.stu.springmybatis.model.EnumDemoEntity" >
    insert into ENUM_DEMO (ID, STR1, STR2, 
      STR3)
    values (#{id,jdbcType=BIGINT}, #{str1,jdbcType=VARCHAR}, #{str2,jdbcType=VARCHAR}, 
      #{str3,jdbcType=VARCHAR,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler})
  </insert>
看数据库结果

STR3 字段由之前的 INIT 变为了索引序数 0
在这里插入图片描述

参考内容

[1]、http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
[2]、《深入浅出 Mybatis 技术原理与实战》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值