八、MybatisPlus-进阶使用-枚举处理器

139 阅读2分钟

本文是系列文章,目录:
一、MybatisPlus-基本使用
二、MybatisPlus-进阶使用-条件构造器
三、MybatisPlus-进阶使用-自定义sql
四、MybatisPlus-进阶使用-Service接口(1)-基本使用
五、MybatisPlus-进阶使用-Service接口(2)-自定义service
六、MybatisPlus-进阶使用-Service接口(3)- 批量新增
七、MybatisPlus-进阶使用-逻辑删除
八、MybatisPlus-进阶使用-枚举处理器
九、MybatisPlus-进阶使用-JSON类型处理器
十、MybatisPlus-进阶使用-配置文件加密
十一、MybatisPlus-插件功能-分页插件(1)
十二、MybatisPlus-插件功能-分页插件(2)-通用分页封装
十三、MybatisPlus-插件功能-乐观锁插件
十四、MybatisPlus-插件功能-sql性能分析
十五、MybatisPlus-自动填充字段
MybatisPlus-问题汇总

什么是枚举处理器,为什么使用它

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

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

使用枚举处理器

1.定义枚举类

package com.pino.demo.enums;

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

2.修改User.java和UserVo.java实体类中status字段类型为UserStatus 类型

/**
 * 使用状态(1正常 2冻结)
 */
private UserStatus status;

3.使用枚举处理器进行类型转换

要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。

注解标记实现接口两种方式可以实现。

方式一:注解标记(@EnumValue)

package com.pino.demo.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

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

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

方式二:实现接口

实现 IEnum 接口,实现 getValue 方法,指定枚举值在数据库中存储的实际值。支持枚举类中的任意字段,如序号或编码。

// 方式二:实现IEnum接口
public enum UserStatus implements IEnum<Integer> {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结")
    ;
    private final int value;
    @JsonValue
    private final String desc;

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

    @Override
    public Integer getValue() {
       return this.value;
    }
}

4.测试

http://localhost:8080/doc.html#/home

image.png

号外:

需要注意的是原本在扣减余额的地方判断用户状态,要修改为:

@Override
public void deductBalance(Long id, Integer money) {
    // 1.查询用户
    User user = getById(id);
    // 2.判断用户状态
    if (user == null || user.getStatus().equals(UserStatus.FREEZE)) {
       throw new RuntimeException("用户状态异常");
    }
}