MybatisPlus——通用枚举

目录

[9 通用枚举](#9 通用枚举)

[9.1 通用枚举的作用](#9.1 通用枚举的作用)

[9.2 代码实现](#9.2 代码实现)


9 通用枚举

9.1 通用枚举的作用

让 Java 枚举和数据库字段自动映射,不用手动转值,代码更清晰、安全。
比如存性别时,直接用SexEnum.MALE,框架自动把枚举里@EnumValue标记的1存到数据库;查的时候又自动把数据库的1转回SexEnum.MALE,不用自己写转换逻辑,还能避免传错值(比如传个3这种无效性别)。

9.2 代码实现

  1. 数据库添加字段
    类型设置为int,默认值为1。

  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):

  • 定义具体的枚举值,每个枚举项对应一个 "数据库存储值 + 描述" 的组合。

  • 枚举项的名称(如MALE/FEMALE)可以自定义(比如写成MAN/WOMAN也没问题),但通常会遵循语义化命名(见名知意)。

  • 枚举项的本质是调用枚举的构造方法初始化实例:

    MALE(1, "男") → 等价于 new SexEnum(1, "男")(只是枚举的构造是JVM自动完成的)
    FEMALE(2, "女") → 等价于 new SexEnum(2, "女")
    //所以枚举项名称只是标识,真正决定数据库存储值和描述的是构造方法传入的参数(1/2和"男"/"女")。

@EnumValue:

  • MyBatis-Plus 的核心注解,标记该属性是与数据库字段映射的值(如存 1 代表男,2 代表女)。
    构造方法:
  • 枚举的构造方法是私有的(默认),用于初始化每个枚举项的sex(数据库值)和sexName(描述)。
  1. 配置扫描通用枚举
    配置枚举扫描路径是为了让 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 无法识别枚举类,会导致枚举与数据库值的转换失败。
  1. 实体类添加字段

    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 存入数据库)。
  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);
    }

相关推荐
golang学习记2 小时前
Go 实时批处理:让数据库少挨点打 [特殊字符]
开发语言·数据库·golang
wang09072 小时前
Linux性能优化之平均负载
linux·数据库·性能优化
电商API&Tina2 小时前
比价 / 选品专用:京东 + 淘宝 核心接口实战(可直接复制运行)
大数据·数据库·人工智能·python·json·音视频
heze093 小时前
sqli-labs-Less-53
数据库·mysql·网络安全
咕噜签名-铁蛋3 小时前
GPU型实例安装nvidia-fabricmanager服务完整实操指南
大数据·数据库·人工智能·ai编程
sqyno1sky3 小时前
数据分析与科学计算
jvm·数据库·python
gjc5924 小时前
如何写好SQL:企业内训文档
数据库·sql
liulilittle4 小时前
SQLite3增删改查(C
c语言·开发语言·数据库·c++·sqlite
Astro_ChaoXu4 小时前
GAMSE使用日志与教程(高分辨率光谱数据缩减)
linux·数据库·python