一.枚举处理器

我们的表中有标识用户状态的字段,这个字段中有两个状态值,1代表正常,2代表冻结。那么我们要使用这些状态就会出现一些问题:
1.如果状态值较多,那么使用数字去表示很麻烦。
2.状态值较多我们也无法通过数字去辨别具体哪个数字代表哪个状态。
因此我们基于数字去进行赋值和比较就很麻烦,容易出错。因此我们使用枚举表示。
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,将该注解加在指定返回的属性上,指定查询枚举值时以哪个值返回。
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;}
}
