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. 自测清单(你跑通就算掌握)
- 插入一条用户,
sex=MALE,看数据库sex是否为1。 - 再插入一条用户,
sex=FEMALE,看数据库sex是否为2。 - 查询用户列表(selectList),看实体里的
sex字段是否能正常映射成枚举(调试/打印看看)。
5. 常见坑(提前避雷)
type-enums-package包路径写错 / 没写:枚举不会按通用枚举处理(最常见)。@EnumValue没加:MP 不知道你要把枚举里的哪个字段存库(容易存成别的形式)。- 数据库列类型不匹配:你
@EnumValue是 Integer,但列是 varchar(或反过来),会导致转换/入库异常。