# mybatis-enum **Repository Path**: mirrors_abel533/mybatis-enum ## Basic Information - **Project Name**: mybatis-enum - **Description**: MyBatis 枚举全面使用指南 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-08 - **Last Updated**: 2026-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 连续好几天都在写这篇 GitChat,加起来的时间可能已经超过20多小时了。 本来想和之前的 Chat 一样发布后在 1 个月后免费,现在发现制度变了,付费文章需要等待 1 年后才能免费,想要参与的可以点击底部阅读原文查看。 为了能让更多人尽可能了解枚举的用法,本场 GitChat 文章对应的示例源码会同步放到 github 上,看不到文章的朋友也可以看示例源码进行了解。 文章写的非常详细,大概有20多页,下面是个目录以及开头的一部分内容(最终发布前仍然可能调整)。 >全文地址:https://gitbook.cn/gitchat/activity/5c31e09e0be52863d8388be4 ## MyBatis 枚举全面使用指南 ### 1. 从最早版本的用法说起 MyBatis 从一开始就自带了两个枚举的类型处理器 `EnumTypeHandler` 和 `EnumOrdinalTypeHandler`,这两个枚举类型处理器可以用于最简单情况下的枚举类型。 为了方便下面的讲解,先假设有如下简单的枚举类型: ```java package tk.mybatis.enums.enumordinaltypehandler; public enum Sex { MALE, FEMALE } ``` #### 1.1 EnumTypeHandler 这个类型处理器是 MyBatis 中默认的枚举类型处理器,他的作用是将枚举的名字和枚举类型对应起来。对于 `Sex` 枚举来说,存数据库时会使用 `"MALE"` 或者 `"FEMALE"` 字符串存储,从数据库取值时,会将字符串转换为对应的枚举。 #### 1.2 EnumOrdinalTypeHandler 这是另一个枚举类型处理器,他的作用是将枚举的索引和枚举类型对应起来。对于 `YesNoEnum ` 枚举来说,存数据库时会使用枚举对应的顺序 `0(MALE)` 或者 `1(FEMALE)` 存储,从数据库取值时,会将整型顺序号(int)转换为对应的枚举。 #### 1.3 如何配置这两种枚举类型 因为 `EnumTypeHandler` 是默认的枚举处理器,所以默认不做任何配置的情况下,就使用的这个类型处理器,因此如果需要存储 `"MALE"` 或者 `"FEMALE"` 值,就不需要任何配置。 如果想存储枚举对应的索引,可以按照下面的方式进行配置: ```xml ``` 还可以省略 `jdbcType="VARCHAR"` 属性,按下面方式进行配置: ```xml ``` 按上述方式进行配置后,就可以使用索引值存库,如果有很多枚举怎么办,难道还要一个个进行配置吗?目前有很多方式可以解决这个问题,不同 MyBatis 版本可以通过不同的方式去处理,后面会一一说明。 当你看到上面这两种配置的变化时,会不会有种心虚的感觉,以后遇到类似情况时会不会无从下手? 既然枚举用法只是类型处理器的一种,而类型处理器又存在着各种变化,我们不妨先深入看看类型处理器的处理过程。 >本文主要的配置都使用的 mybatis-3-config 格式的配置文件,**********后续和 Spring 及 Spring Boot 集成部分也有相应的配置方式**********。 ### 2. 深入了解 TypeHandler 类型处理器 #### 2.1 只有 `typeHandlerClass` 时 #### 2.2 当提供 `typeHandlerClass` 和 `javaTypeClass` 时 #### 2.3 当这三个属性都提供时 #### 2.4 查找类型处理器 ### 3. 配置类型处理器 #### 3.1 全局配置 ##### 3.1.1 `` 方式 ##### 3.1.2 `` 方式 #### 3.2 局部配置 ##### 3.2.1 查询结果的映射 ##### 3.2.2 `#{attr}` 方式 ### 4. MyBatis 3.4.5+ #### 4.1 根据更新代码变化来学习新功能 ##### 4.1.1 MyBatis 3.2.8 版本代码 ##### 4.1.2 MyBatis 3.4.5 版本代码 ##### 4.1.3 对比版本变化 #### 4.2 枚举接口的用法 ##### 4.2.1 定义接口 ##### 4.2.2 定义两个枚举类 ##### 4.2.3 实现接口对应的类型处理器 ##### 4.2.4 配置类型处理器 #### 4.3 默认枚举处理器 #### 4.4 继承形式的类型处理器 ### 5. Spring 集成 由于 Spring 和 Spring Boot 配置方式不同,这里分别讲解各自的配置方式。 ### [5.1 Spring XML 配置](https://github.com/abel533/mybatis-enum/tree/master/src/test/java/tk/mybatis/enums/spring) Spring 集成 MyBatis 的时候,配置 `SqlSessionFactoryBean` 时如果指定 `configLocation`,就可以用 MyBatis 配置方式配置,示例如下: ```xml ``` 如果你真用的这种方式,也没任何问题,如果我只提供这么一个方案就有点说不过去了。下面看看纯 Spring 的配置方式: ```xml ``` `SqlSessionFactoryBean` 提供了 `typeHandlers` 属性配置,因此可以用这种方式进行配置。但是这种方式配置有点特殊的地方,在用这种方式时,无法指定 `javaType` 类型,因此上面的例子用了 `@MappedTypes(LabelValue.class)` 注解。 除此之外,配置 `LabelValueTypeHandler` 因为构造方法的原因,要多配置一个 ``,如果增加一个默认无参的构造方法,例如下面的代码: ```java @MappedTypes(LabelValue.class) public class LabelValueTypeHandler extends BaseTypeHandler { private Class type; private Map enumMap; public LabelValueTypeHandler() { } public LabelValueTypeHandler(Class type) { //省略其他 } ``` 此时上面的配置可以简化为: ```xml ``` 这些都是技巧,结合本文所有示例看 **2. 深入了解 TypeHandler 类型处理器** 时会加深理解,对这种用法会了解的更多。 除了 `typeHandlers` 配置外,`SqlSessionFactoryBean` 还提供了 `typeAliasesPackage` 配置类型处理器的包名,通过扫描包获取包下所有类型处理器,示例如下: ```xml ``` 如果想在纯 Spring 配置情况下配置默认枚举类型处理,可以用下面的方式: ```xml ``` 针对 Spring XML 配置方式就这几种,下面看看 Spring Boot 如何配置。 #### 5.2 Spring Boot 配置 #### 5.3 Spring MVC 中的枚举转换 ### 6. 总结