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

相关推荐
A-刘晨阳1 小时前
AI原生时序数据库选型指南:从数据存储到智能决策的范式跃迁
数据库·时序数据库·ai-native
HalvmånEver3 小时前
MySQL的增删改查命令合集合集
数据库·sql·oracle
不剪发的Tony老师3 小时前
dblab:一款基于终端的交互式数据库客户端
数据库·sql
xwz小王子4 小时前
Science Robotics基础模型正在改写机器人集群的“游戏规则”
数据库·人工智能·机器人
茉莉玫瑰花茶4 小时前
LangGraph 介绍
服务器·网络·数据库
倒霉蛋小马4 小时前
【Redis】利用Redis构造全局唯一ID
数据库
夕除4 小时前
springboot--06
数据库·spring boot·mybatis
2401_833033624 小时前
golang如何实现MQTT主题通配符路由_golang MQTT主题通配符路由实现策略
jvm·数据库·python
运维小子5 小时前
JumpServer Applet 发布自定义远程应用:Oracle SQL Developer 自动登录
数据库·sql·oracle·jumpserver
m0_596749095 小时前
Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】
jvm·数据库·python