本文是系列文章,目录:
一、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
号外:
需要注意的是原本在扣减余额的地方判断用户状态,要修改为:
@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("用户状态异常");
}
}