mybatis-plus 枚举类型处理器

User类中有一个用户状态字段:

像这种字段我们一般会定义一个枚举,做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型,对应的PO也是Integer。因此业务操作时必须手动把枚举Integer转换,非常麻烦。

因此,MybatisPlus提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换

3.3.1.定义枚举

我们定义一个用户状态的枚举:

代码如下

package com.itheima.mp.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结")
    ;
    private final int value;
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

然后把User类中的status字段改为UserStatus 类型:

要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。 MybatisPlus提供了@EnumValue注解来标记枚举属性:

配置枚举处理器

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

### MyBatis-Plus枚举类型的处理及使用 #### 配置默认枚举处理器 为了使 MyBatis-Plus 能够自动识别并处理枚举类型,默认情况下可以在 `application.yml` 或者其他配置文件中指定默认的枚举处理器: ```yaml mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler ``` 这使得框架能够按照预设的方式将 Java 的枚举对象映射到数据库中的相应值[^1]。 #### 使用 @EnumValue 注解简化操作 除了通过全局配置外,还可以利用 `@EnumValue` 注解直接作用于 POJO 类内的枚举字段上。此注解允许开发者更灵活地控制如何将枚举实例转化为存储在数据库里的具体数值表示形式。例如,在实体类中定义如下属性即可实现这一功能: ```java import com.baomidou.mybatisplus.annotation.EnumValue; // ... public class UserInfo { @ApiModelProperty(value = "性别") @EnumValue private SexEnum sex; } ``` 当执行插入或更新语句时,MyBatis-Plus 将依据该注解指示的方法获取对应的整数或其他基本数据类型作为实际存入数据库的内容[^2]。 #### 自动化枚举支持配置 对于项目中存在的大量不同业务逻辑下的枚举类来说,手动为每一个都编写 TypeHandler 显得繁琐而低效。因此,MyBatis-Plus 提供了一种更为便捷的做法——只需声明要扫描的目标包路径,则系统会自动完成剩余工作: ```yaml mybatis-plus: type-enums-package: com.example.enums,com.anotherpackage.enums ``` 上述配置意味着任何位于这些目录及其子目录下定义过的枚举都会被纳入考虑范围之内,并为其生成相应的适配器以便顺利参与到 SQL 执行过程中去[^3]。 #### 测试验证 最后可以通过简单的单元测试来检验整个流程是否正常运作。下面给出一段基于 JUnit 编写的简单例子用来展示向表里新增一条记录的过程: ```java @Test void testInsertUserInfo() { UserInfo userInfo = new UserInfo(); userInfo.setAge(22); userInfo.setName("张三"); userInfo.setSex(SexEnum.MALE); int result = userInfoMapper.insert(userInfo); assertEquals(1, result); // 断言影响行数应等于1 System.out.println("Inserted user info: " + userInfo); } ``` 这段代码创建了一个新的用户信息对象并将之保存到了持久层中,同时打印出了刚插入的数据详情以供后续调试分析所用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值