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

更新时间 2023-01-13 15:28:58

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

前言

大家好,我是小哈。

本小节中,我们将讲解 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 中使用通用枚举类,希望对小伙伴们有帮助。