通用枚举的配置可以优化代码,增强代码的可读性
效果:插入数据时:与前端商定传递枚举属性序数值(0,1,2 )或者 枚举字面量 或者枚举属性name值 (下架,发布中,暂存)其中一种方式(不同方式可能需要重写JsonDeserializer<>的deserialize方法,后面会讲),后端用枚举类型接收,数据库保存0,1,2,查询时:返回json数据 下架,发布中,暂存。
官网地址:通用枚举 | MyBatis-Plus
①声明通用枚举属性,使用@EnumValue标记数据库存的值,使用@JsonValue标记响应前端json的值
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@Getter
@Slf4j
public enum ReleaseStatusEnum {
/**
* 下架
*/
DOWN(0, "下架"),
/**
* 发布中
*/
PUBLISHING(1, "发布中"),
/**
* 暂存
*/
TEMP_SAVE(2, "暂存");
ReleaseStatusEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
@EnumValue
private final Integer code;
@JsonValue
private final String message;
}
②配置扫描通用枚举,两种方式任选其一即可,注意,第二种不通的版本对应的EnumTypeHandler类名和路径可能不同
mybatis-plus.type-enums-package=com.xxx.localdemo.web.*.*
mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler
③前端参数传递:如果你以枚举的属性进行传参,但枚举的序数不是从0开始,或者以枚举字面量进行传参,那么你需要声明反序列化类继承JsonDeserializer<>,重写deserialize方法,使用@JsonDeserialize(using = ReleaseStatusEnum .Deserializer.class)标记反序列化规则。如果你以枚举的属性进行传参,且枚举的序数是从0开始那么不重写也可以;
public static class Deserializer extends JsonDeserializer<ReleaseStatusEnum> {
@Override
public ReleaseStatusEnum deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String text = jsonParser.getText();
try {
for (ReleaseStatusEnum releaseStatusEnum : ReleaseStatusEnum.values()) {
if (releaseStatusEnum.getCode().equals(Integer.valueOf(text))) {
return releaseStatusEnum;
}
}
return null;
} catch (Exception e) {
log.warn("反序列化枚举类出错", e);
return null;
}
}
}
接收前端对象的对应属性添加 @JsonDeserialize指定反序列化方式
/**
* 发布状态 0下架 1发布 2暂存
*/
@JsonDeserialize(using = ReleaseStatusEnum.Deserializer.class)
private ReleaseStatusEnum releaseStatus;
效果如图:
前端参数转换
存入数据库的值
查询展示到前端的数据