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

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

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

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

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

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

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

3.在MybatisPlus的攔截器中加上樂觀鎖的攔截器
在SQL發(fā)送到數(shù)據(jù)庫之前,動態(tài)修改它。
樂觀鎖攔截器,樂觀鎖是一種解決并發(fā)沖突的機制,它假設并發(fā)沖突很少發(fā)生,所以在更新時檢查數(shù)據(jù)是否被修改過。
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mpInterceptor;
攔截器幫我們做了三件事:
- 在SET語句中自動加上
version = version + 1 - 在WHERE條件中自動加上
AND version = 舊版本號 - 如果更新失?。ㄓ绊懶袛?shù)為0),拋出異常
結語:
到此這篇關于MyBatis-Plus為何用JavaBean映射數(shù)據(jù)庫表及樂觀鎖實戰(zhàn)的文章就介紹到這了,更多相關MyBatis-Plus映射JavaBean內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?MVC基于注解的使用之JSON數(shù)據(jù)處理的方法
這篇文章主要介紹了Spring?MVC基于注解的使用JSON數(shù)據(jù)處理,json是一種輕量級的數(shù)據(jù)交換格式,是一種理想的數(shù)據(jù)交互語言,它易于閱讀和編寫,同時也易于機器解析和生成,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-05-05
java?-jar啟動參數(shù)設置file.encoding編碼,解決中文亂碼的問題
這篇文章主要介紹了java?-jar啟動參數(shù)設置file.encoding編碼,解決中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過程詳解
查看JAVA字節(jié)碼有兩種方式一種是使用 jdk命令 javap,還有一種就是 使用 插件了,今天給大家分享IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過程詳解,感興趣的朋友跟隨小編一起看看吧2021-05-05
Spring?Boot?使用?Disruptor?做內部高性能消息隊列
這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內部高性能消息隊列,工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka,也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄2022-06-06

