淺談MyBatisPlus注解@EnumValue避坑
摘要
本文介紹如何使用MyBatisPlus的注解@EnumValue聲明枚舉類,同時(shí)指出需要避開的幾個(gè)常見坑點(diǎn)。
認(rèn)識(shí)注解
@EnumValue會(huì)自動(dòng)將數(shù)據(jù)庫中枚舉類型(如tinyint)字段映射成Java對象枚舉字段類型,同時(shí)也能將Java對象枚舉類型字段的值映射成數(shù)據(jù)庫中的枚舉類型字段值。
應(yīng)用場景
- 通過枚舉統(tǒng)一管理單據(jù)狀態(tài),如訂單狀態(tài)(0: 待支付, 1: 已支付, 2: 已取消)
注意事項(xiàng)
- 枚舉字段的默認(rèn)值存在隱式分配:未顯式指定枚舉值時(shí),默認(rèn)從 0 開始遞增,可能與數(shù)據(jù)庫實(shí)際值沖突。
- 自定義映射邏輯缺失:未實(shí)現(xiàn) TypeHandler 或未覆蓋 getDescByCode() 方法,導(dǎo)致反向映射失敗。
- 字段類型匹配:@EnumValue標(biāo)記的枚舉類屬性的類型要和數(shù)據(jù)庫字段的類型對應(yīng)(如int對應(yīng)TINYINT),否則在查詢數(shù)據(jù)的時(shí)候無法轉(zhuǎn)化為枚舉類型,并顯示為null。
代碼示例
1)構(gòu)建數(shù)據(jù)表結(jié)構(gòu)[mysql]
CREATE TABLE `task` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `work_type` TINYINT NOT NULL, -- 映射到 WorkType 枚舉 `description` VARCHAR(255) );
2)導(dǎo)入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
3)定義實(shí)體對象
import com.baomidou.mybatisplus.annotation.*; import lombok.Data; @Data @TableName("task") public class Task { @TableId(type = IdType.AUTO) private Long id; // 數(shù)據(jù)庫字段為 TINYINT,映射到 WorkType 枚舉 @EnumValue @TableField("work_type") private WorkType workType; @TableField("description") private String description; }
4)定義枚舉類
import com.baomidou.mybatisplus.annotation.EnumValue; //顯式指定數(shù)值 public enum WorkType { DEV(0, "開發(fā)"), TEST(1, "測試"), IT(2, "運(yùn)維"); @EnumValue private final int workCode; //數(shù)據(jù)庫字段類型為TINYINT private final String workDec; WorkType(int workCode, String workDec) { this.workCode = workCode; this.workDec = workDec; } public String getWorkDec() { return workDec; } //通過數(shù)值獲取文字描述 public static WorkType getDescByCode(int value) { for (WorkType workType : WorkType.values()) { if (workType.workCode == value) { return workType; } } return null; } }
5)使用MyBatisplus進(jìn)行增刪改查
import lombok.extern.slf4j.Slf4j; import org.coffeebeans.enumvalue.Task; import org.coffeebeans.enumvalue.TaskService; import org.coffeebeans.enumvalue.WorkType; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * <li>ClassName: org.org.coffeebeans.EnumValueTest </li> * <li>Author: OakWang </li> */ @Slf4j @SpringBootTest public class EnumValueTest { @Autowired private TaskService taskService; @Test void test1() { // 插入操作 Task task = new Task(); task.setWorkType(WorkType.IT); // Java 枚舉 → 數(shù)據(jù)庫 TINYINT task.setDescription("運(yùn)維"); taskService.save(task); /* 執(zhí)行時(shí)間:8 ms,執(zhí)行SQL:INSERT INTO task ( work_type, description ) VALUES ( 2, '運(yùn)維' ) */ } @Test void test2() { // 查詢操作 Task result = taskService.getById(1L); System.out.println(result.getWorkType().getWorkDec()); /* 執(zhí)行時(shí)間:10 ms,執(zhí)行SQL:SELECT id,work_type AS workType,description FROM task WHERE id=1 運(yùn)維 */ } @Test void test3() { // 查詢操作 Task result = taskService.getById(1L); // 更新操作 result.setWorkType(WorkType.DEV); task.setDescription("開發(fā)"); taskService.updateById(result); /* 執(zhí)行時(shí)間:10 ms,執(zhí)行SQL:SELECT id,work_type AS workType,description FROM task WHERE id=1 執(zhí)行時(shí)間:5 ms,執(zhí)行SQL:UPDATE task SET work_type=0, description='開發(fā)' WHERE id=1 */ } }
總結(jié)
以上我們了解了MyBatisPlus中的注解@EnumValue可以巧妙靈活地自動(dòng)映射對象字段和數(shù)據(jù)庫表字段,使用時(shí)需要顯式指定數(shù)值、匹配字段類型、合理自定義映射邏輯。
到此這篇關(guān)于淺談MyBatisPlus注解@EnumValue避坑的文章就介紹到這了,更多相關(guān)MyBatisPlus @EnumValue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解
這篇文章主要介紹了Java方法的參數(shù)傳遞機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了java方法參數(shù)傳遞機(jī)制原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問題
這篇文章主要介紹了解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05arthas在idea和docker中的應(yīng)用方式
這篇文章主要介紹了arthas在idea和docker中的應(yīng)用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-10-10IntelliJ IDEA 2020.2 配置大全詳細(xì)圖文教程(更新中)
這篇文章主要介紹了IntelliJ IDEA 2020.2 配置大全(更新中),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08spring的TransactionalEventListener事務(wù)感知源碼解析
這篇文章主要為大家介紹了spring的TransactionalEventListener事務(wù)感知源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java實(shí)現(xiàn)EasyCaptcha圖形驗(yàn)證碼的具體使用
Java圖形驗(yàn)證碼,支持gif、中文、算術(shù)等類型,可用于Java Web、JavaSE等項(xiàng)目,下面就跟隨小編一起來了解一下2021-08-08java多線程Synchronized實(shí)現(xiàn)可見性原理解析
這篇文章主要介紹了java多線程Synchronized實(shí)現(xiàn)可見性原理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Java8實(shí)戰(zhàn)之Stream的延遲計(jì)算
JDK中Stream的中間函數(shù)如 filter(Predicate super T>)是惰性求值的,filter并非對流中所有元素調(diào)用傳遞給它的Predicate,下面這篇文章主要給大家介紹了關(guān)于Java8實(shí)戰(zhàn)之Stream延遲計(jì)算的相關(guān)資料,需要的朋友可以參考下2021-09-09