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);
    }

相关推荐
这个DBA有点耶5 小时前
期货 CTP 系统 Oracle RAC 迁移国产库实战:读写分离架构设计与性能对标
数据库·架构·dba
数据库安全5 小时前
AI数据访问安全 |如何控制AI访问权限,防止越权
数据库·安全
这个DBA有点耶6 小时前
Redo Log循环写与checkpoint推进:长事务阻塞下的Checkpoint风暴完整链路
数据库·mysql·代码规范
jnrjian6 小时前
pg_waldump --key-file-name status 查看wal 产生的db
数据库
SelectDB技术团队7 小时前
Snowflake 的开源替代怎么选:能力对照、三条部署路径与迁移执行
大数据·数据库·云原生·开源·snowflake·apache doris
Elastic 中国社区官方博客7 小时前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
京东云开发者8 小时前
当我谈数据库高可用时我谈些什么
数据库
梦影_8 小时前
MySQL进阶教程(一)—— 储存过程与触发器(上)
开发语言·数据库·后端·sql·mysql·中间件
星禾元亨8 小时前
用结构化数据与干净实体信号,让技术内容被 AI 搜索引擎稳定引用
数据库·人工智能·自动化·创业创新
底层玩家老张8 小时前
45:1压缩、19.1倍查询:1956亿行时序数据复盘
数据库·经验分享·时序数据库·存储压缩·写入优化