七、通用枚举

26 阅读2分钟

1. 通用枚举是用来解决什么问题?

表里有些字段取值是固定集合(例如:性别=男/女),这类字段用 int / varchar 在代码里容易出现“魔法值”(1/2、male/female)。MyBatis-Plus 提供通用枚举机制,让你在实体类里用 Java Enum 表达,同时入库/出库能自动映射。

本节在教程里的步骤是:
a) 表加 sex 字段 → b) 创建枚举 → c) 配置扫描 → d) 测试


2. 落地步骤

Step A:数据库表添加 sex 字段

在用户表(例:t_user)里加一个 sex 列,用于保存枚举对应的值(比如 1=男,2=女)。

你可以用 INT 存 1/2(和后面的示例一致)。


Step B:创建通用枚举 SexEnum

关键点:@EnumValue 标记“入库值”字段

教程示例(核心长这样):

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

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

    @EnumValue
    private Integer sex;     // 入库值:1/2
    private String sexName;  // 展示值:男/女

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

你要记住的一句话: @EnumValue 标在哪个属性上,MP 就把哪个属性的值存到数据库里。


Step C:配置扫描通用枚举

要让 MP 知道“哪些包里是通用枚举”,需要配 type-enums-package。教程示例:

mybatis-plus:
  global-config:
    db-config:
      # 配置扫描通用枚举
      type-enums-package: com.atguigu.mybatisplus.enums

注意:包名一定要写你枚举类的真实包路径,否则不生效(这是最常见的坑)。


Step D:实体类里把字段类型改成枚举

你需要在 User 实体里把 sex 字段类型写成 SexEnum(字段名和列名一致时一般不需要额外注解)。


3. 测试:插入时是否按枚举值入库?

教程的测试点:给用户设置 SexEnum.MALE,最终入库参数是 1

user.setSex(SexEnum.MALE);
// INSERT ... sex = 1

日志里能看到类似:
Parameters: ..., 1(Integer)


4. 自测清单(你跑通就算掌握)

  1. 插入一条用户,sex=MALE,看数据库 sex 是否为 1
  2. 再插入一条用户,sex=FEMALE,看数据库 sex 是否为 2
  3. 查询用户列表(selectList),看实体里的 sex 字段是否能正常映射成枚举(调试/打印看看)。

5. 常见坑(提前避雷)

  • type-enums-package 包路径写错 / 没写:枚举不会按通用枚举处理(最常见)。
  • @EnumValue 没加:MP 不知道你要把枚举里的哪个字段存库(容易存成别的形式)。
  • 数据库列类型不匹配:你 @EnumValue 是 Integer,但列是 varchar(或反过来),会导致转换/入库异常。