目录
[9 通用枚举](#9 通用枚举)
[9.1 通用枚举的作用](#9.1 通用枚举的作用)
[9.2 代码实现](#9.2 代码实现)
9 通用枚举
9.1 通用枚举的作用
让 Java 枚举和数据库字段自动映射,不用手动转值,代码更清晰、安全。
比如存性别时,直接用SexEnum.MALE,框架自动把枚举里@EnumValue标记的1存到数据库;查的时候又自动把数据库的1转回SexEnum.MALE,不用自己写转换逻辑,还能避免传错值(比如传个3这种无效性别)。
9.2 代码实现
-
数据库添加字段
类型设置为int,默认值为1。

-
创建通用枚举类型
package com.qcby.mybatisplus1129.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;@Getter //Lombok 注解,自动生成属性的getter方法(MyBatis-Plus 需要通过 getter 获取@EnumValue标记的属性值)
public enum SexEnum {// 枚举项:MALE代表"男",FEMALE代表"女" MALE(1, "男"), FEMALE(2, "女"); @EnumValue // 标记数据库中存储的对应值(核心注解) private Integer sex; // 数据库中实际存储的数值(1/2) private String sexName; // 枚举的描述(男/女) // 枚举的构造方法(枚举项通过此方法初始化属性) SexEnum(Integer sex, String sexName) { this.sex = sex; this.sexName = sexName; }}
枚举项(MALE/FEMALE):
-
定义具体的枚举值,每个枚举项对应一个 "数据库存储值 + 描述" 的组合。
-
枚举项的名称(如MALE/FEMALE)可以自定义(比如写成MAN/WOMAN也没问题),但通常会遵循语义化命名(见名知意)。
-
枚举项的本质是调用枚举的构造方法初始化实例:
MALE(1, "男") → 等价于 new SexEnum(1, "男")(只是枚举的构造是JVM自动完成的)
FEMALE(2, "女") → 等价于 new SexEnum(2, "女")
//所以枚举项名称只是标识,真正决定数据库存储值和描述的是构造方法传入的参数(1/2和"男"/"女")。
@EnumValue:
- MyBatis-Plus 的核心注解,标记该属性是与数据库字段映射的值(如存 1 代表男,2 代表女)。
构造方法: - 枚举的构造方法是私有的(默认),用于初始化每个枚举项的sex(数据库值)和sexName(描述)。
-
配置扫描通用枚举
配置枚举扫描路径是为了让 MyBatis-Plus 自动处理枚举与数据库的转换mybatis-plus:
configuration:
# 配置MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: tx_配置扫描通用枚举
type-enums-package: com.qcby.mybatisplus1129.enums
配置type-enums-package是因为:
MyBatis-Plus 需要扫描指定包下的枚举类,并自动为这些枚举注册类型处理器(TypeHandler),实现:
- 存入数据库时:自动将枚举转换为@EnumValue标记的数值(如SexEnum.MALE→1)。

- 查询数据库时:自动将数据库的数值转换为对应的枚举(如 1→SexEnum.MALE)。

- 如果不配置这个路径,MyBatis-Plus 无法识别枚举类,会导致枚举与数据库值的转换失败。
-
实体类添加字段
package com.qcby.mybatisplus1129.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.qcby.mybatisplus1129.enums.SexEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic
private Integer isDeleted;
private SexEnum sex; // 用枚举类作为字段类型}
用枚举类作为字段类型是因为:
- 语义化更清晰:直接用SexEnum.MALE/SexEnum.FEMALE表示性别,比用1/2或"男"/"女"更直观,代码可读性大幅提升。
- 类型安全:只能传入枚举中定义的合法值(如SexEnum.MALE),避免传入3或"未知"这类非法值,编译期就能发现错误。
- 自动转换:因为配置了枚举扫描,MyBatis-Plus 会自动处理枚举与数据库值的转换,无需手动写代码(如不用手动把SexEnum.MALE转成 1 存入数据库)。
-
测试
@Test
public void testSexEnum(){
User user = new User();
user.setName("Enum2");
user.setAge(22);
//设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
user.setSex(SexEnum.FEMALE);
System.out.println(user);
//INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? ) //Parameters: Enum(String), 20(Integer), 1(Integer)
userMapper.insert(user);
}
