MyBatis-Plus通用枚舉的實(shí)現(xiàn)示例
MyBatis-Plus 通用枚舉是基于 MyBatis 的類型處理器 TypeHandler 擴(kuò)展實(shí)現(xiàn)的標(biāo)準(zhǔn)化、通用化枚舉適配方案,核心定位是解決代碼層枚舉語義化與數(shù)據(jù)庫層編碼輕量化的映射問題。
它通過注解(@EnumValue)或接口(IEnum)約定枚舉值與數(shù)據(jù)庫存儲編碼的映射規(guī)則,結(jié)合枚舉包掃描機(jī)制,實(shí)現(xiàn)枚舉類型與數(shù)據(jù)庫字段編碼的無侵入式自動化雙向轉(zhuǎn)換,無需開發(fā)者編寫手動轉(zhuǎn)換邏輯,且一套規(guī)則可統(tǒng)一適配所有符合約定的枚舉類。
示例詳解
下面通過示例對MyBatis-Plus通用枚舉的執(zhí)行流程進(jìn)行詳細(xì)介紹
數(shù)據(jù)庫表添加字段sex

創(chuàng)建通用枚舉類型
用 @EnumValue 標(biāo)注數(shù)據(jù)庫存儲的枚舉編碼字段
@Getter
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue
private Integer sex; // 核心字段
private String sexName; // 業(yè)務(wù)描述字段
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
MyBatis-Plus 通用枚舉類的核心構(gòu)成要素如下:
首先需通過 @Getter 注解(或手動編寫)為所有私有字段提供 Getter 方法,滿足 MP 反射獲取字段值的基礎(chǔ)要求;其次必須定義由 @EnumValue 注解標(biāo)注的數(shù)據(jù)庫映射核心字段,該字段是 MP 實(shí)現(xiàn)枚舉和數(shù)據(jù)庫編碼雙向轉(zhuǎn)換的唯一依據(jù),寫庫時反射獲取其編碼值寫入數(shù)據(jù)庫,讀庫時依據(jù)編碼值反向匹配枚舉項(xiàng);可寫業(yè)務(wù)描述字段(非 MP 強(qiáng)制要求,可提升枚舉的業(yè)務(wù)語義可讀性);此外需聲明具體枚舉項(xiàng),每個枚舉項(xiàng)對應(yīng)一組數(shù)據(jù)庫編碼值和業(yè)務(wù)描述值,枚舉項(xiàng)將抽象的業(yè)務(wù)狀態(tài)轉(zhuǎn)化為代碼中語義明確、可直接引用的實(shí)例;最后通過私有構(gòu)造器完成核心字段與業(yè)務(wù)描述字段的初始化。
在 MyBatis-Plus 早期版本中,實(shí)現(xiàn)通用枚舉的主流方式是讓枚舉類實(shí)現(xiàn) IEnum 接口,且需指定接口泛型(泛型類型與數(shù)據(jù)庫編碼字段類型一致),并強(qiáng)制重寫 getValue() 方法,下面是具體代碼
@Getter
public enum SexEnum1 implements IEnum<Integer> {
MALE(1, "男"),
FEMALE(2, "女");
private Integer sex;
private String sexName;
SexEnum1(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
@Override
public Integer getValue() {
return this.sex;
}
}
新版仍兼容該方式,若枚舉同時標(biāo)注 @EnumValue 和實(shí)現(xiàn) IEnum 接口,@EnumValue 的優(yōu)先級更高
實(shí)體類
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// 枚舉
private SexEnum sex;
}
實(shí)體類中的 sex 屬性無需定義為數(shù)據(jù)庫存儲的編碼類型,可直接聲明為自定義的通用枚舉類型,MyBatis-Plus 框架會自動完成枚舉類型與數(shù)據(jù)庫編碼之間的雙向轉(zhuǎn)換
type-enums-package 是 MyBatis-Plus 配置文件中用于指定通用枚舉類掃描包路徑的配置項(xiàng)。MP 啟動階段會掃描該路徑下所有符合通用枚舉規(guī)范的枚舉類,一方面自動識別枚舉類中基于@EnumValue / IEnum 定義的映射規(guī)則,另一方面為這些枚舉類自動綁定內(nèi)置的 MybatisEnumTypeHandler 類型處理器,而 MybatisEnumTypeHandler 作為核心組件,支撐了通用枚舉與數(shù)據(jù)庫編碼之間的自動雙向轉(zhuǎn)換能力。

測試代碼
@Autowired
private UserMapper userMapper;
@Test
public void testSexEnum(){
User user = new User();
user.setName("Enum");
user.setAge(20);
user.setEmail("test@enum.com");
user.setSex(SexEnum.MALE);
userMapper.insert(user);
System.out.println(user.getSex()); // 獲取枚舉實(shí)例
System.out.println(user.getSex().getSex()); // 獲取數(shù)據(jù)庫存儲的編碼值
System.out.println(user.getSex().getSexName()); // 獲取業(yè)務(wù)描述
}
執(zhí)行 user.setSex(SexEnum.MALE); MP 會通過 MybatisEnumTypeHandler 自動將枚舉項(xiàng) SexEnum.MALE 轉(zhuǎn)換為其 @EnumValue 標(biāo)注的編碼值 1 寫入數(shù)據(jù)庫。
user.getSex() 獲取 SexEnum.MALE 枚舉實(shí)例
user.getSex().getSex() 獲取數(shù)據(jù)庫存儲的編碼值
user.getSex().getSexName() 獲取業(yè)務(wù)描述
執(zhí)行結(jié)果如圖:


到此這篇關(guān)于MyBatis-Plus通用枚舉的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus通用枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springmvc如何實(shí)現(xiàn)向前臺傳遞數(shù)據(jù)
這篇文章主要介紹了Springmvc如何實(shí)現(xiàn)向前臺傳遞數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Springboot 跨域配置無效及接口訪問報(bào)錯的解決方法
這篇文章主要介紹了Springboot 跨域配置無效及接口訪問報(bào)錯的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故
在Spring中進(jìn)行事務(wù)管理非常簡單,只需要在方法上加上注解@Transactional,那么為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故,本文就詳細(xì)的介紹一下2021-11-11
Java的Struts框架中<results>標(biāo)簽的使用方法
這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11
SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南
在項(xiàng)?開發(fā)中,對于前端提交的表單,后臺接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-07-07
Spring注解@Configuration與@Bean注冊組件的使用詳解
這篇文章主要介紹了SpringBoot中的注解@Configuration與@Bean注冊組件的使用,具有很好的參考價(jià)值,希望對大家有所幫助2022-06-06

