MyBatisPlus用JavaBean映射數(shù)據(jù)庫(kù)表及樂觀鎖實(shí)戰(zhàn)指南
前言:上一篇我們講解了MybatisPlus查詢的相關(guān)基礎(chǔ)操作以及null值的處理,這一章節(jié)我們主要補(bǔ)充查詢中存在的一些特殊情況如映射匹配兼容性,
映射匹配兼容性:
當(dāng) MyBatis-Plus 執(zhí)行 SQL 時(shí),它需要知道我們的 Java 實(shí)體類對(duì)應(yīng)數(shù)據(jù)庫(kù)中的哪一張表。它的查找順序是:注解 -> 全局策略 -> 實(shí)體類名(駝峰轉(zhuǎn)下劃線)。
其次就是在MybatisPlus這個(gè)框架中,我們寫的JavaBean主要是為了將數(shù)據(jù)庫(kù)表結(jié)構(gòu)映射為內(nèi)存中的 Java 對(duì)象。
為什么 MyBatis-Plus 要用 JavaBean 來(lái)對(duì)應(yīng)數(shù)據(jù)庫(kù)表
MyBatis-Plus 選擇用 JavaBean 作為實(shí)體類,是因?yàn)?JavaBean 的規(guī)范完美地解決了 ORM(對(duì)象關(guān)系映射) 的幾個(gè)核心需求:
- 數(shù)據(jù)封裝:表的字段對(duì)應(yīng) JavaBean 的屬性。
- 賦值能力:MyBatis-Plus 通過(guò)反射調(diào)用
setter方法,將數(shù)據(jù)庫(kù)查詢結(jié)果填入對(duì)象。 - 取值能力:MyBatis-Plus 通過(guò)反射調(diào)用
getter方法,獲取參數(shù)值拼接到 SQL 中(例如插入數(shù)據(jù)時(shí)獲取字段值)。 - 自省能力:通過(guò) JavaBean 的方法命名規(guī)范,框架可以推斷出屬性名,實(shí)現(xiàn)“約定大于配置”。
| 概念 | 解釋 |
|---|---|
| JavaBean | 是一種代碼編寫規(guī)范 (私有屬性 + getter/setter + 無(wú)參構(gòu)造)。它就像一個(gè)通用的數(shù)據(jù)盒子。 |
| 數(shù)據(jù)庫(kù)表對(duì)應(yīng) | 是 JavaBean 在持久層的一個(gè)具體應(yīng)用場(chǎng)景。當(dāng) JavaBean 專門用來(lái)映射數(shù)據(jù)庫(kù)表時(shí),我們稱之為實(shí)體類 (Entity)。 |
因此自然而然的出現(xiàn)了下面的一些問(wèn)題:
1.當(dāng)表字段與編碼屬性設(shè)計(jì)不同步時(shí):
使用@TableField(value=“”)注解,寫在模型類屬性上方。value設(shè)置數(shù)據(jù)庫(kù)表字段的名稱。

2.編碼中添加了數(shù)據(jù)庫(kù)中未定義的屬性
exist:設(shè)置屬性在數(shù)據(jù)庫(kù)表字段中是否存在,默認(rèn)為true。此屬性無(wú)法與value合并使用
@TableField(exist = false)

3.采用默認(rèn)查詢開放了更多的字段查看權(quán)限
如密碼字段在執(zhí)行的時(shí)候,會(huì)在前臺(tái)進(jìn)行展示,這樣是完全不合理的,因此我們可以設(shè)置select設(shè)置屬性是否參與查詢

4.表名與開發(fā)設(shè)置不匹配

關(guān)于是現(xiàn)有JavaBean還是現(xiàn)有數(shù)據(jù)庫(kù)表先出現(xiàn)
- 在大多數(shù)使用 MyBatis-Plus 的互聯(lián)網(wǎng)企業(yè)級(jí)項(xiàng)目中,通常流程是:設(shè)計(jì)數(shù)據(jù)表 $\rightarrow$ 使用代碼生成器生成 JavaBean。因?yàn)檫@樣效率高,且能保證數(shù)據(jù)庫(kù)設(shè)計(jì)的合理性。
- 但理解也可以先有 JavaBean 這種反向思維,能幫你更好地理解面向?qū)ο笤O(shè)計(jì),以及為什么 JavaBean 會(huì)有那么多注解來(lái)定義字段映射關(guān)系。
| 維度 | 先有數(shù)據(jù)表 (傳統(tǒng)/數(shù)據(jù)驅(qū)動(dòng)) | 先有 JavaBean (DDD/領(lǐng)域驅(qū)動(dòng)) |
|---|---|---|
| 出發(fā)點(diǎn) | 數(shù)據(jù)如何存儲(chǔ)、如何查詢更快 | 業(yè)務(wù)如何建模、如何封裝規(guī)則 |
| JavaBean 角色 | 數(shù)據(jù)的載體 (只有g(shù)etter/setter) | 業(yè)務(wù)邏輯的核心 (包含行為方法) |
| 對(duì)應(yīng)關(guān)系 | JavaBean 完全匹配數(shù)據(jù)庫(kù) | 數(shù)據(jù)庫(kù)表適配 JavaBean (可能有映射轉(zhuǎn)換) |
| 適用場(chǎng)景 | 報(bào)表系統(tǒng)、簡(jiǎn)單的CRUD后臺(tái)、對(duì)性能要求極高的系統(tǒng) | 業(yè)務(wù)邏輯復(fù)雜的核心系統(tǒng)、微服務(wù)、中臺(tái) |
| 設(shè)計(jì)者 | DBA、后端開發(fā) | 領(lǐng)域?qū)<摇⒓軜?gòu)師、后端開發(fā) |
id生成策略控制:
主鍵id是什么,MyBatis-Plus執(zhí)行 updateById、deleteById 等方法時(shí),需要知道哪個(gè)字段是主鍵
如果沒有標(biāo)記,MyBatis-Plus就不知道用哪個(gè)條件去更新或刪除
唯一標(biāo)識(shí)一條記錄,被其他表引用(建立表間關(guān)系),提高查詢效率,數(shù)據(jù)庫(kù)會(huì)自動(dòng)為主鍵創(chuàng)建索引,所以通過(guò)主鍵查詢是最快的。簡(jiǎn)單來(lái)說(shuō),主鍵就是每一行數(shù)據(jù)的"身份證號(hào)",主鍵就像是數(shù)據(jù)世界的"坐標(biāo)",沒有它,你就無(wú)法精確找到任何一條數(shù)據(jù),也無(wú)法建立表與表之間的關(guān)系。
在MyBatis-Plus中,主鍵有多種生成方式,通過(guò) @TableId 的 type 屬性指定:
1. AUTO(數(shù)據(jù)庫(kù)自增)
@TableId(type = IdType.AUTO) private Long id;
ASSIGN_ID(分布式ID,雪花算法)
@TableId(type = IdType.ASSIGN_ID) private Long id;
NPUT(手動(dòng)輸入)
@TableId(type = IdType.INPUT) private String orderNo; // 主鍵可能是業(yè)務(wù)編號(hào)
ASSIGN_UUID(UUID字符串)
@TableId(type = IdType.ASSIGN_UUID) private String id; // 注意這里是String類型
| 作用維度 | 具體說(shuō)明 | 類比理解 |
|---|---|---|
| 唯一標(biāo)識(shí) | 每條記錄的唯一ID | 身份證號(hào) |
| 查詢速度 | 主鍵索引,查詢最快 | 書的頁(yè)碼 |
| 表間關(guān)聯(lián) | 被外鍵引用,建立關(guān)系 | 人與人之間的親屬關(guān)系憑證 |
| 數(shù)據(jù)完整性 | 不能為null,不能重復(fù) | 保證每個(gè)人都有一個(gè)唯一且有效的身份 |
我們也可以在yml文件中進(jìn)行全局配置,不用在每個(gè)JavaBean中寫注解

多記錄操作:
按照主鍵刪除多條記錄
List<Long> ids= Arrays.aslist(new Long[]{2,3});userDao.deleteBatchIds (ids);
根據(jù)主鍵查詢多條記錄
List<Long> ids= Arrays.asList(new Long[]{2,3});List<User> userList = userDao.selectBatchIds(ids);
邏輯刪除:
在有些情況時(shí),我們刪除數(shù)據(jù)的時(shí)候,會(huì)導(dǎo)致業(yè)務(wù)數(shù)據(jù)從數(shù)據(jù)庫(kù)中廢棄。因此我們使用邏輯刪除,并不是真正的把數(shù)據(jù)刪除。,而是為數(shù)據(jù)設(shè)置為是否可用字段,需要?jiǎng)h除時(shí)設(shè)置為不可用字段(如員工離職,但是員工做成的業(yè)務(wù)對(duì)公司有用,所以不能完全刪除掉),數(shù)據(jù)保留在數(shù)據(jù)庫(kù)中。
1.在數(shù)據(jù)庫(kù)表添加邏輯刪除字段
2.實(shí)體類中添加對(duì)應(yīng)的字段,并表明是邏輯字段。

3.配置邏輯刪除字面值(全局配置簡(jiǎn)化)

樂觀鎖:
在實(shí)際生活中,某平臺(tái)開放了秒殺活動(dòng),但只有100個(gè)名額,但是搶購(gòu)的人很多,當(dāng)就剩最后一個(gè)名額的時(shí)候,但又有很多人搶購(gòu),這個(gè)名額歸誰(shuí)呢,這時(shí)就需要我們的鎖機(jī)制了。
1.在數(shù)組庫(kù)表中加一個(gè)樂觀鎖字段
2.在實(shí)體類中加上對(duì)應(yīng)的字段

3.在MybatisPlus的攔截器中加上樂觀鎖的攔截器
在SQL發(fā)送到數(shù)據(jù)庫(kù)之前,動(dòng)態(tài)修改它。
樂觀鎖攔截器,樂觀鎖是一種解決并發(fā)沖突的機(jī)制,它假設(shè)并發(fā)沖突很少發(fā)生,所以在更新時(shí)檢查數(shù)據(jù)是否被修改過(guò)。
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mpInterceptor;
攔截器幫我們做了三件事:
- 在SET語(yǔ)句中自動(dòng)加上
version = version + 1 - 在WHERE條件中自動(dòng)加上
AND version = 舊版本號(hào) - 如果更新失敗(影響行數(shù)為0),拋出異常
結(jié)語(yǔ):
到此這篇關(guān)于MyBatis-Plus為何用JavaBean映射數(shù)據(jù)庫(kù)表及樂觀鎖實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)MyBatis-Plus映射JavaBean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot使用MybatisPlus實(shí)現(xiàn)mysql樂觀鎖
- MyBatis-Plus 樂觀鎖的具體實(shí)現(xiàn)
- Mybatis-Plus樂觀鎖配置流程
- SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例
- mybatis?plus樂觀鎖及實(shí)現(xiàn)詳解
- SpringBoot整合MyBatis-Plus樂觀鎖不生效的問(wèn)題及解決方法
- MyBatis-Plus通過(guò)version機(jī)制實(shí)現(xiàn)樂觀鎖的思路
- Mybatis plus的自動(dòng)填充與樂觀鎖的實(shí)例詳解(springboot)
相關(guān)文章
Spring?MVC基于注解的使用之JSON數(shù)據(jù)處理的方法
這篇文章主要介紹了Spring?MVC基于注解的使用JSON數(shù)據(jù)處理,json是一種輕量級(jí)的數(shù)據(jù)交換格式,是一種理想的數(shù)據(jù)交互語(yǔ)言,它易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
mybatisplus?isNotNull不生效問(wèn)題及解決
這篇文章主要介紹了mybatisplus?isNotNull不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java中的RecursiveTask從原理到實(shí)踐全面解析
RecursiveTask 是 Java 并發(fā)編程中 Fork/Join 框架的核心組件,專為??可遞歸分解且需返回結(jié)果??的并行任務(wù)設(shè)計(jì),本文從原理到實(shí)踐全面解析Java中的RecursiveTask,感興趣的朋友跟隨小編一起看看吧2025-10-10
java?-jar啟動(dòng)參數(shù)設(shè)置file.encoding編碼,解決中文亂碼的問(wèn)題
這篇文章主要介紹了java?-jar啟動(dòng)參數(shù)設(shè)置file.encoding編碼,解決中文亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
java中的常見幾種發(fā)送http請(qǐng)求實(shí)例
在Java編程中,發(fā)送HTTP請(qǐng)求是一個(gè)常見需求,常用的方法有四種:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式時(shí),需要添加額外的庫(kù)支持2024-11-11
java編程中實(shí)現(xiàn)調(diào)用js方法分析
這篇文章主要介紹了java編程中實(shí)現(xiàn)調(diào)用js方法,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了java編程中調(diào)用js方法的常用操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09
深入解析Java中的Classloader的運(yùn)行機(jī)制
這篇文章主要介紹了Java中的Classloader的運(yùn)行機(jī)制,包括從JVM方面講解類加載器的委托機(jī)制等,需要的朋友可以參考下2015-11-11
IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過(guò)程詳解
查看JAVA字節(jié)碼有兩種方式一種是使用 jdk命令 javap,還有一種就是 使用 插件了,今天給大家分享IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過(guò)程詳解,感興趣的朋友跟隨小編一起看看吧2021-05-05
Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列
這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列,工作中遇到項(xiàng)目使用Disruptor做消息隊(duì)列,對(duì)你沒看錯(cuò),不是Kafka,也不是rabbitmq。Disruptor有個(gè)最大的優(yōu)點(diǎn)就是快,還有一點(diǎn)它是開源的哦,下面做個(gè)簡(jiǎn)單的記錄2022-06-06

