MyBatis-Plus之通用枚举
前言
MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储为1(表示男)、2(表示女)。在读取数据库的数据时就会自动将1、2值转换为男或女,返回给前端。
这样做是可以有效地节省数据库的存储空间。下面我们来看看枚举的使用方式~
MyBatis官方文档讲解的MyBatisPlus枚举使用
官方文档讲MyBatisPlus的枚举的地址:https://www.baomidou.com/pages/8390a4/#%E6%AD%A5%E9%AA%A41-%E5%A3%B0%E6%98%8E%E9%80%9A%E7%94%A8%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7
MyBatisPlus的通用枚举解决了繁琐的配置,可以做到让 mybatis 优雅的使用枚举属性! 从MyBatisPlus的 3.5.2 版本开始只需完成 步骤1: 声明通用枚举属性
即可使用。
步骤1: 声明通用枚举属性
方式一: 使用 @EnumValue 注解枚举属性 完整示例(opens new window)
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue//标记数据库存的值是code
private final int code;
//。。。
}
方式二: 枚举属性,实现 IEnum 接口如下:
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
private int value;
private String desc;
@Override
public Integer getValue() {
return this.value;
}
}
实体属性使用枚举类型(方式一和方式二都要做这一步的,age演示的是使用IEnum接口的枚举处理,grade使用的是原生枚举)
public class User {
/**
* 名字
* 数据库字段: name varchar(20)
*/
private String name;
/**
* 年龄,IEnum接口的枚举处理
* 数据库字段:age INT(3)
*/
private AgeEnum age;
/**
* 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
步骤2: 配置扫描通用枚举
- 注意!! 从 3.5.2 开始无需配置
- 注意!! spring mvc 配置参考,安装集成 MybatisSqlSessionFactoryBean 枚举包扫描,spring boot 例子配置如下:
示例工程:
👉 mybatisplus-spring-boot(opens new window)
方式一:仅配置指定包内的枚举类使用 MybatisEnumTypeHandler
配置文件 resources/application.yml
mybatis-plus:
# 支持统配符 * 或者 ; 分割。这里写的是使用了@EnumValue的枚举的包名或者实现了IEnum接口的枚举的包名
typeEnumsPackage: com.baomidou.springboot.entity.enums
....
当添加这个配置后,mybatis-plus 提供的 MybatisSqlSessionFactoryBean
会自动扫描包内合法的枚举类(使用了 @EnumValue
注解,或者实现了 IEnum
接口),分别为这些类注册使用 MybatisEnumTypeHandler
。
换句话说,只有指定包下的枚举类会使用新的 TypeHandler。其他包下,或者包内没有做相关改造的枚举类,仍然会使用 mybatis 的 DefaultEnumTypeHandler。
方式二:直接指定 DefaultEnumTypeHandler
此方式用来 全局
修改 mybatis 使用的 EnumTypeHandler。
配置文件 resources/application.yml
mybatis-plus:
# 修改 mybatis 的 DefaultEnumTypeHandler
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
自定义配置类 MybatisPlusAutoConfiguration
@Configuration
public class MybatisPlusAutoConfiguration {
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
return properties -> {
GlobalConfig globalConfig = properties.getGlobalConfig();
globalConfig.setBanner(false);
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
properties.setConfiguration(configuration);
};
}
}
如何序列化枚举值为前端返回值?
可以使用Jackson、或者Fastjson都行。使用Jackson可以使用下面的重写 toString 方法
或者注解处理
来达到告诉框架返回给前端的内容都行。使用Fastjson你就得重写toString方法了,可以使用下面的全局处理方式或者局部处理方式来做都行。
Jackson
一、重写 toString 方法
springboot
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer(){
return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
}
ackson
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
以上两种方式任选其一,然后在枚举中复写 toString 方法,返回那个你要展示给前端的值,即可.
二、注解处理
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue
@JsonValue //标记响应json值
private final int code;
}
Fastjson
一、重写 toString 方法
全局处理方式
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteEnumUsingToString);
局部处理方式
@JSONField(serialzeFeatures= SerializerFeature.WriteEnumUsingToString)
private UserStatus status;
以上两种方式任选其一,然后在枚举中复写 toString 方法即可.
例子
1. 导MyBatisPlus的包
2. 定义枚举类
3. 扫描
4. 在实体类里面使用枚举
具体例子:
1. 导包
2. 定义枚举类
3. 扫描
4. 在实体类里面使用枚举
5. 测试
我们先看看测试的环境哈!
好了,来演示:
数据库原来是这样的:
执行后,我们看到孙悟空加进来了,且status被成功变为了1,即实习对应的值。
我们看看输入,数字是不是可行。
看到,一样是可行的。且前端展示的时候,也是把我们要展示的字段展示出来了。
展示代码如下:
优化前端展示:
效果:
上面的下拉就相当于是:你选择哪个选项,然后就把那个选项对应的value值给作为那个status变量的值了,然后传给后端,后端看到是1,存到数据库里面就是1,展示给前端的时候,就显示1对应的值,即“实习”