MyBatis-Plus通用枚举的实现示例

 更新时间:2025年12月12日 08:24:54   作者:期待のcode  
本文主要介绍 MyBatis-Plus 通用枚举,及通过具体案例进行演示实现流程和原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MyBatis-Plus 通用枚举是基于 MyBatis 的类型处理器 TypeHandler 扩展实现的标准化、通用化枚举适配方案,核心定位是解决代码层枚举语义化与数据库层编码轻量化的映射问题。

它通过注解(@EnumValue)或接口(IEnum)约定枚举值与数据库存储编码的映射规则,结合枚举包扫描机制,实现枚举类型与数据库字段编码的无侵入式自动化双向转换,无需开发者编写手动转换逻辑,且一套规则可统一适配所有符合约定的枚举类。

示例详解

下面通过示例对MyBatis-Plus通用枚举的执行流程进行详细介绍

数据库表添加字段sex

创建通用枚举类型
用 @EnumValue 标注数据库存储的枚举编码字段

@Getter
public enum SexEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private Integer sex;      // 核心字段
    private String sexName;   // 业务描述字段

    SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }
}

MyBatis-Plus 通用枚举类的核心构成要素如下:
首先需通过 @Getter 注解(或手动编写)为所有私有字段提供 Getter 方法,满足 MP 反射获取字段值的基础要求;其次必须定义由 @EnumValue 注解标注的数据库映射核心字段,该字段是 MP 实现枚举和数据库编码双向转换的唯一依据,写库时反射获取其编码值写入数据库,读库时依据编码值反向匹配枚举项;可写业务描述字段(非 MP 强制要求,可提升枚举的业务语义可读性);此外需声明具体枚举项,每个枚举项对应一组数据库编码值和业务描述值,枚举项将抽象的业务状态转化为代码中语义明确、可直接引用的实例;最后通过私有构造器完成核心字段与业务描述字段的初始化。

在 MyBatis-Plus 早期版本中,实现通用枚举的主流方式是让枚举类实现 IEnum 接口,且需指定接口泛型(泛型类型与数据库编码字段类型一致),并强制重写 getValue() 方法,下面是具体代码

@Getter
public enum SexEnum1 implements IEnum<Integer> {
    MALE(1, "男"),
    FEMALE(2, "女");

    private Integer sex;
    private String sexName;

    SexEnum1(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }

    @Override
    public Integer getValue() {
        return this.sex;
    }
}

新版仍兼容该方式,若枚举同时标注 @EnumValue 和实现 IEnum 接口,@EnumValue 的优先级更高

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;
    // 枚举
    private SexEnum sex;

}

实体类中的 sex 属性无需定义为数据库存储的编码类型,可直接声明为自定义的通用枚举类型,MyBatis-Plus 框架会自动完成枚举类型与数据库编码之间的双向转换

type-enums-package 是 MyBatis-Plus 配置文件中用于指定通用枚举类扫描包路径的配置项。MP 启动阶段会扫描该路径下所有符合通用枚举规范的枚举类,一方面自动识别枚举类中基于@EnumValue / IEnum 定义的映射规则,另一方面为这些枚举类自动绑定内置的 MybatisEnumTypeHandler 类型处理器,而 MybatisEnumTypeHandler 作为核心组件,支撑了通用枚举与数据库编码之间的自动双向转换能力。

测试代码

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSexEnum(){
        User user = new User();
        user.setName("Enum");
        user.setAge(20);
        user.setEmail("test@enum.com");
        user.setSex(SexEnum.MALE);
        userMapper.insert(user);
        System.out.println(user.getSex());    // 获取枚举实例
        System.out.println(user.getSex().getSex()); // 获取数据库存储的编码值
        System.out.println(user.getSex().getSexName());  // 获取业务描述
    }

执行 user.setSex(SexEnum.MALE); MP 会通过 MybatisEnumTypeHandler 自动将枚举项 SexEnum.MALE 转换为其 @EnumValue 标注的编码值 1 写入数据库。

user.getSex() 获取 SexEnum.MALE 枚举实例
user.getSex().getSex() 获取数据库存储的编码值
user.getSex().getSexName() 获取业务描述

执行结果如图:

到此这篇关于MyBatis-Plus通用枚举的实现示例的文章就介绍到这了,更多相关MyBatis-Plus通用枚举内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于最长递增子序列问题概述

    关于最长递增子序列问题概述

    本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效地找到最长递增子序列,动态规划+状态压缩则通过状态压缩将空间复杂度优化至O(n)
    2025-02-02
  • 在Mybatis中association标签多层嵌套的问题

    在Mybatis中association标签多层嵌套的问题

    这篇文章主要介绍了在Mybatis中association标签多层嵌套的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 创建线程的3种方法及各自的优点

    Java 创建线程的3种方法及各自的优点

    这篇文章主要介绍了Java 创建线程的3种方法及各自的优点,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java JDK8新增Optional工具类讲解

    Java JDK8新增Optional工具类讲解

    这篇文章主要介绍了Java JDK8新增Optional工具类讲解,本文通过老版和jdk8对比对null的处理方式,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 盘点Java中延时任务的多种实现方式

    盘点Java中延时任务的多种实现方式

    当需要一个定时发布系统通告的功能,如何实现? 当支付超时,订单自动取消,如何实现?其实这些问题本质都是延时任务的实现,本文为大家盘点了多种常见的延时任务实现方法,希望对大家有所帮助
    2022-12-12
  • java省市级联下拉菜单实例代码

    java省市级联下拉菜单实例代码

    这篇文章主要为大家详细介绍了java省市级联实例代码,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-05-05
  • IDEA中设置Run Dashboard方式

    IDEA中设置Run Dashboard方式

    这篇文章主要介绍了IDEA中设置Run Dashboard方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • IntelliJ IDEA多屏后窗口不显示问题解决方案

    IntelliJ IDEA多屏后窗口不显示问题解决方案

    这篇文章主要介绍了IntelliJ IDEA多屏后窗口不显示问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring框架中Bean的各种加载方式详解

    Spring框架中Bean的各种加载方式详解

    这篇文章主要介绍了Spring框架中Bean的各种加载方式详解,在Java中,"Bean"通常指的是由Spring框架管理的对象实例,Spring提供了多种方式来加载Bean,以满足不同的需求和场景,需要的朋友可以参考下
    2023-08-08
  • java性能优化之分代回收

    java性能优化之分代回收

    这篇文章主要介绍了java性能优化之分代回收,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07

最新评论