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//標記數據庫存的值是codeprivate final int code;//。。。
}
方式二: 枚舉屬性,實現 IEnum 接口如下:
public enum AgeEnum implements IEnum<Integer> {ONE(1, "一歲"),TWO(2, "二歲"),THREE(3, "三歲");private int value;private String desc;@Overridepublic 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 的 DefaultEnumTypeHandlerconfiguration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
自定義配置類 MybatisPlusAutoConfiguration
@Configuration
public class MybatisPlusAutoConfiguration {@Beanpublic 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
@Beanpublic 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對應的值,即“實習”