Mybatis Plus 通用枚举(图文讲解)

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观

前言

大家好,我是小哈。

本小节中,我们将讲解 Mybatis Plus 通用枚举的用法。那么,什么是通用枚举呢?之前小节中,我们的用户表有个性别字段 gender,在插入数据时,我们的示例代码大致如下:

User user = new User();
user.setName("犬小哈");
// 0: 女, 1: 男
user.setGender(1);
user.setAge(20);
userMapper.insert(user);

这种编码方式不够优雅,被领导发现了,估计要请你去好好谈一谈了。针对那些表字段是固定几个值的情况(比如性别),正确的做法应该是,新建一个通用的性别枚举类,通过枚举类来设置值,步骤如下:

新建一个 GenderEnum 枚举:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2023-01-13 14:15
 * @version: v1.0.0
 * @description: TODO
 **/
@Getter
public enum GenderEnum {
    WOMAN(0, "女"),
    MAN(1, "男"),
    ;

    private final Integer code;
    private final String desc;

    GenderEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

然后插入数据代码如下:

@Test
void testEnum() {
    User user = new User();
    user.setName("犬小哈");
    user.setGender(GenderEnum.MAN.getCode());
    user.setAge(20);
    userMapper.insert(user);
}

这样,针对需要设置获取性别的地方,枚举可以重复利用,代码可读性提升,更不容易发生数值设置错误的情况发生。

问题来了,可不可以直接设置实体类中性别字段为枚举呢?

答案是可以的,也正是本文要讲的内容,接下来看看要如何做。

依赖版本

Mybatis Plus 的版本推荐大于等于 3.5.2, 因为从这个版本后,通用枚举配置步骤根据方便了:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

表结构

测试用户表执行脚本如下:

DROP TABLE IF EXISTS t_user;

CREATE TABLE `t_user` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `gender` tinyint(2) NOT NULL DEFAULT 0 COMMENT '性别,0:女 1:男',
  PRIMARY KEY (`id`)
) COMMENT = '用户表';

新建枚举类

在项目根目录下,新建包 enums, 用于统一放置项目枚举类,并新建 GenderEnum 枚举:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2023-01-13 14:15
 * @version: v1.0.0
 * @description: TODO
 **/
@Getter
public enum GenderEnum {
    WOMAN(0, "女"),
    MAN(1, "男"),
    ;

    @EnumValue
    private final Integer code;
    private final String desc;


    GenderEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

注意:@EnumValue 注解用于告诉 MP 存数据时,使用 code 字段的值。

实体类

将前面小节中,新建的用户实体类中的性别字段改成枚举:

/**
 * @author: 犬小哈
 * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com
 * @date: 2022-12-13 14:13
 * @version: v1.0.0
 * @description: TODO
 **/
@Data
@TableName("t_user")
public class User {
    /**
     * 主键 ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private GenderEnum gender;
}

单元测试

新建一个单元测试,设置性别的时候,就可以直接使用枚举类了:

@Test
void testEnum() {
    User user = new User();
    user.setName("犬小哈");
    user.setGender(GenderEnum.MAN);
    user.setAge(20);
    userMapper.insert(user);
}

运行该单元测试,看看好不好使:

成功设置了对应的数值,搞定。

结语

本小节中,我们结合具体代码示例,学习了如何在 Mybatis Plus 中使用通用枚举类,希望对小伙伴们有帮助。