淺談MyBatisPlus注解@EnumValue避坑
摘要
本文介紹如何使用MyBatisPlus的注解@EnumValue聲明枚舉類,同時(shí)指出需要避開的幾個(gè)常見坑點(diǎn)。
認(rèn)識(shí)注解
@EnumValue會(huì)自動(dòng)將數(shù)據(jù)庫(kù)中枚舉類型(如tinyint)字段映射成Java對(duì)象枚舉字段類型,同時(shí)也能將Java對(duì)象枚舉類型字段的值映射成數(shù)據(jù)庫(kù)中的枚舉類型字段值。
應(yīng)用場(chǎng)景
- 通過枚舉統(tǒng)一管理單據(jù)狀態(tài),如訂單狀態(tài)(0: 待支付, 1: 已支付, 2: 已取消)
注意事項(xiàng)
- 枚舉字段的默認(rèn)值存在隱式分配:未顯式指定枚舉值時(shí),默認(rèn)從 0 開始遞增,可能與數(shù)據(jù)庫(kù)實(shí)際值沖突。
- 自定義映射邏輯缺失:未實(shí)現(xiàn) TypeHandler 或未覆蓋 getDescByCode() 方法,導(dǎo)致反向映射失敗。
- 字段類型匹配:@EnumValue標(biāo)記的枚舉類屬性的類型要和數(shù)據(jù)庫(kù)字段的類型對(duì)應(yīng)(如int對(duì)應(yīng)TINYINT),否則在查詢數(shù)據(jù)的時(shí)候無(wú)法轉(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í)體對(duì)象
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@Data
@TableName("task")
public class Task {
@TableId(type = IdType.AUTO)
private Long id;
// 數(shù)據(jù)庫(kù)字段為 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, "測(cè)試"),
IT(2, "運(yùn)維");
@EnumValue
private final int workCode; //數(shù)據(jù)庫(kù)字段類型為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ù)庫(kù) 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)映射對(duì)象字段和數(shù)據(jù)庫(kù)表字段,使用時(shí)需要顯式指定數(shù)值、匹配字段類型、合理自定義映射邏輯。
到此這篇關(guān)于淺談MyBatisPlus注解@EnumValue避坑的文章就介紹到這了,更多相關(guān)MyBatisPlus @EnumValue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目完整后端請(qǐng)求Controller層優(yōu)雅處理
這篇文章主要為大家介紹了springboot項(xiàng)目Controller層代碼的優(yōu)雅處理實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
java(包括springboot)讀取resources下文件方式實(shí)現(xiàn)
這篇文章主要介紹了java(包括springboot)讀取resources下文件方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java顯示當(dāng)前運(yùn)行時(shí)的參數(shù)(java運(yùn)行參數(shù))
這篇文章主要介紹了java顯示當(dāng)前運(yùn)行時(shí)參數(shù)的示例(java運(yùn)行參數(shù)),需要的朋友可以參考下2014-04-04
Java開發(fā)環(huán)境不再需要配置classpath問題
這篇文章主要介紹了Java開發(fā)環(huán)境不再需要配置classpath問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Mybatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)(DEMO)
本節(jié)要實(shí)現(xiàn)的是多表關(guān)聯(lián)查詢的簡(jiǎn)單demo。場(chǎng)景是根據(jù)id查詢某商品分類信息,并展示該分類下的商品列表,需要的朋友可以參考下2017-02-02

