MyBatisPlus枚举处理器的实现

 更新时间:2026年03月04日 10:50:27   作者:ruleslol  
MyBatis-Plus 提供了枚举处理器,让我们可以优雅地在数据库字段和Java 枚举之间进行转换,而不需要手动处理映射关系,下面就来详细的介绍一下,感兴趣的可以了解一下

MyBatis-Plus 提供了枚举处理器,让我们可以优雅地在数据库字段Java 枚举之间进行转换,而不需要手动处理映射关系。

一、为什么需要枚举处理器?

数据库中通常用 0/1'A'/'B' 这样的值表示状态,而 Java 中我们希望使用枚举类型。没有枚举处理器时,需要手动转换,容易出错且代码冗余。

二、实现方式

在枚举字段上加 @EnumValue,标记哪个字段的值存入数据库:

示例:

【备注】:

类型处理器多是由mybatis提供;

但是mybatis-plus在此基础上,添加了两个常用的类型处理器

2-1、实现步骤

1、通过注解@EnumValue,告诉mp,枚举中的哪一个字段作为数据库中的存值

2、通过配置项,让枚举处理器生效

3、对于枚举的返回值,由springMVC中的Jackson json处理,通过注解@JsonValue,标记返回枚举中的哪一个值。

2-2、小结:

三、反序列化时(接收前端参数),配合@JsonCreator

前端传来 JSON 数据 → Java 把它转换成对象,这个过程会遇到坑!

若是枚举示例如下:

按照当前逻辑,当传值是desc字符串时:

{
    "username":"商丛书6",
    "email":"shang@qq.com",
    "age":22,
    "status":"冻结"
}

数据库存值没有问题。

但是当传值是value时:

{
    "username":"商丛书7",
    "email":"shang@qq.com",
    "age":22,
    "status":1
}

存值有误:

原因:

因为 Jackson 默认支持按枚举的 ordinal(下标顺序)来反序列化,而不是你 @EnumValue 定义的 code 值:

public enum UserStatus {
    NORMAL(1, "正常"),   // ordinal=0,code=1
    FROZEN(-1, "冻结"); // ordinal=1,code=0
}

整个链路:

Postman 传 "冻结"
    ↓ Jackson 反序列化(@JsonValue 的 desc 字段匹配)
UserStatus.NORMAL 枚举对象
    ↓ MyBatis-Plus 写库(@EnumValue 的 value 字段)
数据库存 -1
Postman 传 1
    ↓ Jackson 按 ordinal 匹配(第1个枚举)
UserStatus.FROZEN 枚举对象
    ↓ MyBatis-Plus 写库
数据库存 -1

3-1、解决方法:@JsonCreator

在枚举里加 @JsonCreator 方法,根据你想支持的传值方式来写。

@JsonCreator 是加在枚举类里的一个静态方法上,这个方法你自己来写:

@Getter
public enum UserStatus {

    NORMAL(1, "正常"),
    FROZEN(-1, "冻结");

    @EnumValue
    private int value;
    @JsonValue
    private String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @JsonCreator
    public static UserStatus of(int value){
        for (UserStatus e : values()){
            if(value == e.value){
                return e;
            }
        }
        throw new IllegalArgumentException("无效的状态值: " + value);
    }
}

这样前端传 "status": 1 时,Jackson 就会调用这个 of(1) 方法,按 value 字段去匹配枚举,而不是按 ordinal 顺序,避免了之前说的那个坑。

【注意】:方法名不一定叫of!!!

名字随便起,@JsonCreator 才是关键,Jackson 认的是这个注解,不是方法名。

叫什么都行:

@JsonCreator
public static UserStatus fromCode(int code) { ... }

@JsonCreator
public static UserStatus getByCode(int code) { ... }

@JsonCreator
public static UserStatus create(int code) { ... }

of 只是一个约定俗成的命名习惯,参考了 Java 标准库的风格(比如 Optional.of()LocalDate.of() 等),看起来简洁,但并不是强制要求。

一个枚举里只能有一个 @JsonCreator 方法,因为 Jackson 反序列化时只能有一个入口,多了它不知道该用哪个,会报错。

如果你想同时支持数字和字符串,就在这一个方法里做兼容处理:

@JsonCreator
public static UserStatus of(Object val) {
    String str = val.toString().trim();
    for (UserStatus e : values()) {
        // 既能匹配 code(数字),也能匹配 desc(中文)
        if (String.valueOf(e.code).equals(str) || e.desc.equals(str)) {
            return e;
        }
    }
    throw new IllegalArgumentException("无效的状态值: " + val);
}

这样前端传 0 或者 "正常" 都能正确匹配。

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

相关文章

  • Java毕业设计实战之宠物医院与商城一体的系统的实现

    Java毕业设计实战之宠物医院与商城一体的系统的实现

    这是一个使用了java+Springboot+Jsp+maven+Mysql开发的宠物医院与商城一体的系统,是一个毕业设计的实战练习,具有宠物医院和宠物商城该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • SpringMVC配置javaConfig及StringHttpMessageConverter示例

    SpringMVC配置javaConfig及StringHttpMessageConverter示例

    这篇文章主要介绍了SpringMVC配置javaConfig及StringHttpMessageConverter实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java final与泛型详细解析

    Java final与泛型详细解析

    文章主要介绍了Java中的final关键字、泛型以及包装类,final关键字用于确保变量、方法和类不会被修改,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • javaweb 项目初始配置的方法步骤

    javaweb 项目初始配置的方法步骤

    本文主要介绍了javaweb 项目初始配置的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 深入Java注解原理Annotation

    深入Java注解原理Annotation

    这篇文章主要介绍了深入Java注解原理Annotation,注解可以附加在package,class,method,field等上面,可相当于添加了额外的辅助信息,可以通过反射机制编程实现对这些元数据的访问,需要的朋友可以参考下
    2023-10-10
  • Java实现经典游戏打砖块游戏的示例代码

    Java实现经典游戏打砖块游戏的示例代码

    这篇文章主要介绍了如何利用Java实现经典的游戏—打砖块。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。感兴趣的小伙伴可以了解一下
    2022-02-02
  • 解读@SpringBootApplication注解有什么用

    解读@SpringBootApplication注解有什么用

    @SpringBootApplication是SpringBoot的核心注解,主要包含@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解,这些注解共同简化了Spring应用的配置工作,并使得通过主程序类就可以启动SpringBoot应用
    2024-09-09
  • Mybatis参数处理的几种方法小结

    Mybatis参数处理的几种方法小结

    在Mybatis中如何处理参数是一个非常重要的环节,本文将详细介绍 Mybatis 的参数处理机制,包括传入参数和返回参数的处理方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • mybatis动态插入list传入List参数的实例代码

    mybatis动态插入list传入List参数的实例代码

    本文通过实例代码给大家介绍了mybatis动态插入list,Mybatis 传入List参数的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-04-04
  • idea的运行按钮是灰色问题及解决

    idea的运行按钮是灰色问题及解决

    这篇文章主要介绍了idea的运行按钮是灰色问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论