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

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

測試代碼
@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()); // 獲取枚舉實例
System.out.println(user.getSex().getSex()); // 獲取數(shù)據(jù)庫存儲的編碼值
System.out.println(user.getSex().getSexName()); // 獲取業(yè)務描述
}
執(zhí)行 user.setSex(SexEnum.MALE); MP 會通過 MybatisEnumTypeHandler 自動將枚舉項 SexEnum.MALE 轉換為其 @EnumValue 標注的編碼值 1 寫入數(shù)據(jù)庫。
user.getSex() 獲取 SexEnum.MALE 枚舉實例
user.getSex().getSex() 獲取數(shù)據(jù)庫存儲的編碼值
user.getSex().getSexName() 獲取業(yè)務描述
執(zhí)行結果如圖:


到此這篇關于MyBatis-Plus通用枚舉的實現(xiàn)示例的文章就介紹到這了,更多相關MyBatis-Plus通用枚舉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx+SpringCloud Gateway搭建項目訪問環(huán)境
本文主要介紹了Nginx+SpringCloud Gateway搭建項目訪問環(huán)境,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結
反射是java中一種強大的工具,能夠使我們很方便的創(chuàng)建靈活的代碼,這些代碼可以再運行時裝配,無需在組件之間進行源代碼鏈接,但是反射使用不當會成本很高,這篇文章主要給大家介紹了關于Java開發(fā)反射機制的相關資料,需要的朋友可以參考下2021-07-07
Centos 7 安裝 OpenJDK 11 兩種方式及問題小結
這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09
Java實現(xiàn)修改PDF文件MD5值且保持內容不變
在某些場景中,我們可能需要改變PDF文件的MD5值,而又不希望改變文件的可視內容,本文詳細介紹了如何實現(xiàn)這一目標,并提供了具體的Java實現(xiàn)示例,需要的可以參考下2023-10-10
SSO單點登錄系統(tǒng)實現(xiàn)原理及流程圖解
這篇文章主要介紹了SSO單點登錄系統(tǒng)實現(xiàn)原理及流程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12

