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

創(chuàng)建通用枚舉類型
用 @EnumValue 標注數(shù)據庫存儲的枚舉編碼字段
@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ù)據庫映射核心字段,該字段是 MP 實現(xiàn)枚舉和數(shù)據庫編碼雙向轉換的唯一依據,寫庫時反射獲取其編碼值寫入數(shù)據庫,讀庫時依據編碼值反向匹配枚舉項;可寫業(yè)務描述字段(非 MP 強制要求,可提升枚舉的業(yè)務語義可讀性);此外需聲明具體枚舉項,每個枚舉項對應一組數(shù)據庫編碼值和業(yè)務描述值,枚舉項將抽象的業(yè)務狀態(tài)轉化為代碼中語義明確、可直接引用的實例;最后通過私有構造器完成核心字段與業(yè)務描述字段的初始化。
在 MyBatis-Plus 早期版本中,實現(xiàn)通用枚舉的主流方式是讓枚舉類實現(xiàn) IEnum 接口,且需指定接口泛型(泛型類型與數(shù)據庫編碼字段類型一致),并強制重寫 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ù)據庫存儲的編碼類型,可直接聲明為自定義的通用枚舉類型,MyBatis-Plus 框架會自動完成枚舉類型與數(shù)據庫編碼之間的雙向轉換
type-enums-package 是 MyBatis-Plus 配置文件中用于指定通用枚舉類掃描包路徑的配置項。MP 啟動階段會掃描該路徑下所有符合通用枚舉規(guī)范的枚舉類,一方面自動識別枚舉類中基于@EnumValue / IEnum 定義的映射規(guī)則,另一方面為這些枚舉類自動綁定內置的 MybatisEnumTypeHandler 類型處理器,而 MybatisEnumTypeHandler 作為核心組件,支撐了通用枚舉與數(shù)據庫編碼之間的自動雙向轉換能力。

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


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

