一.枚举处理器

我们的表中有标识用户状态的字段,这个字段中有两个状态值,1代表正常,2代表冻结。那么我们要使用这些状态就会出现一些问题:
1.如果状态值较多,那么使用数字去表示很麻烦。
2.状态值较多我们也无法通过数字去辨别具体哪个数字代表哪个状态。
因此我们基于数字去进行赋值和比较就很麻烦,容易出错。因此我们使用枚举表示。
java
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;
}
}
但是我们定义好枚举类后,并不能解决以下两个问题:
1.我们在定义实体类时,状态字段仍然是Integer类型。
2.在比较时仍然和Integer类型的字段比较。在赋值时仍然赋Integer。
这样会很麻烦。
因此我们会将User的status字段直接改为枚举类型UserStatus。枚举可以直接使用==比较。
但这样会带来另一个问题,数据库表当中status依然是int类型,但是po是枚举类型。那我们查到的数据库中的字段要去转枚举,而写入数据库时也要转为int类型。这样就会十分麻烦。这就涉及到java当中枚举类型和数据库中的类型的相互转换。
mp为我们解决了这些问题,mp加入了枚举类型和json类型的处理器。
使用@EnumValue注解加到和数据库字段对应的枚举字段上,就能实现自动的对应。这样查询和写数据库时就会从枚举中查或写对应的值。
然后在配置文件中配置让枚举处理器生效的配置即可。

当修改过接口使用枚举后,我们进行数据查询。查到的数据如下,可以看到status变成了我们定义的枚举值。

如果我们不想让其返回枚举值,而是返回1,2或者是正常,冻结。我们可以使用注解@JsonValue,将该注解加在指定返回的属性上,指定查询枚举值时以哪个值返回。
java
package com.itheima.mp.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
@Getter
public enum UserStatus {
NORMAL(1, "正常"),
FORZEN(2, "冻结"),
;
@EnumValue // 指定哪个枚举值映射到数据库字段
private final Integer status;
@JsonValue // 指定查询枚举值时以哪个值返回
private final String description;
UserStatus(Integer status, String description) {
this.status = status;
this.description = description;
}
}
