目录
9 通用枚举
9.1 通用枚举的作用
9.2 代码实现
- 数据库添加字段
- 创建通用枚举类型
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)可以自定义(比如写成MAN/WOMAN也没问题),但通常会遵循语义化命名(见名知意)。
- 枚举项的本质是调用枚举的构造方法初始化实例:
MALE(1, "男") → 等价于 new SexEnum(1, "男")(只是枚举的构造是JVM自动完成的)
FEMALE(2, "女") → 等价于 new SexEnum(2, "女")
//所以枚举项名称只是标识,真正决定数据库存储值和描述的是构造方法传入的参数(1/2和"男"/"女")。
- MyBatis-Plus 的核心注解,标记该属性是与数据库字段映射的值(如存 1 代表男,2 代表女)。
- 枚举的构造方法是私有的(默认),用于初始化每个枚举项的sex(数据库值)和sexName(描述)。
- 配置扫描通用枚举
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
- 存入数据库时:自动将枚举转换为@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);
}

573



被折叠的 条评论
为什么被折叠?



