国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

MyBatis 史詩級裹腳布可以燒了

0
分享至

作為一名 Java 開發(fā)者,你一定經(jīng)歷過被 MyBatis XML 支配的恐懼。

當你打開一個 UserMapper.xml,迎面而來的是幾百行甚至上千行的 , , , 標簽。原本清爽的 SQL 語句被這些 XML 標簽切割得支離破碎,仿佛老太太的裹腳布——又臭又長

如果你也受夠了在 XML 標簽里寫邏輯,受夠了為了一個簡單的非空判斷就要寫三行 XML,那么請繼續(xù)往下看。dbVisitor 的動態(tài) SQL 規(guī)則機制,也許就是你一直在尋找的 "剪刀"。

MyBatis 的 XML 地獄

讓我們先回顧一下,一個標準的、帶有幾個查詢條件的 MyBatis SQL 是什么樣子的:

這段代碼的問題在哪里,已經(jīng)不用多言!這種 一坨一坨 的開發(fā)體驗看到就難受至極,更別提還要去維護它。

革命性的解法

dbVisitor 作為一個新一代的數(shù)據(jù)庫訪問工具,最核心的設(shè)計理念之一就是:讓 SQL 回歸 SQL。

利用 dbVisitor 獨創(chuàng)的 規(guī)則機制,上面的 XML 代碼可以精簡為:

   @{and, create_time >= :createTime}

假設(shè)只傳入?yún)?shù) name="Tom",生成的 SQL 如下:

SELECT * FROM tb_user WHERE name = ?

是不是瞬間清爽了?沒有了尖括號的視覺干擾,沒有了冗余的 XML 閉合標簽,只有純粹的 SQL 邏輯。

你可能會問:@{and, ...} 到底做了什么?它是簡單的字符串拼接嗎?

當然不是!dbVisitor 的規(guī)則是非常智能的,以 @{and, name = :name} 為例,它內(nèi)置了以下邏輯:

智能判空

引擎會自動檢查 key = :key 表達式中的參數(shù)。如果參數(shù) :key 為 null,整個 @{and} 規(guī)則塊會被自動忽略,不會生成任何 SQL。

(注意:空字符串""被視為有效值,不會忽略)

WHERE 處理

如果內(nèi)容不為空 @{and} 會識別它是否是 WHERE 子句的開頭。如果是開頭(例如前面沒有1=1),它會自動抹去 AND,直接生成 WHERE name = ?

(這一點類似 MyBatis 的標簽,但更加隱形)

這一切都是自動發(fā)生的,你只需要聲明規(guī)則,剩下的交給 dbVisitor。

條件判斷本該如此性感

MyBatis 中 90% 的 標簽都是為了做兩件事:

  • 參數(shù)不為空時,追加查詢條件。

  • 開關(guān)開啟時,追加查詢條件。

dbVisitor 將這兩類高頻場景直接內(nèi)化為最基礎(chǔ)的規(guī)則,無需任何復雜的標簽嵌套。

智能補全

自動檢查條件狀態(tài)選擇是否需要自動補全 WHERE/AND/OR 關(guān)鍵字。

    @{and, name = :name} -- 生成 and name = ?

2. 智能判空

@{and} 和 @{or} 這是最常用的判空規(guī)則,它們會自動檢查參數(shù)是否為 null。

  @{or,  age > :age}   -- 僅當 age 不為空時生成  or  age > ?

3. 開關(guān)控制

@{ifand} 和 @{ifor} 當你需要用布爾值來控制 SQL 時就會使用他們。

SELECT * FROM tb_user @{ifand, !showAll, is_delete = 0}

對比 MyBatis 的臃腫寫法以及像老鼠屎一樣無處不在的 1=1

僅僅是一個簡單的條件,dbVisitor 讓你少寫了 3 行代碼,減少無用的條件判斷,這就是效率。

一行代碼的 IN 查詢

MyBatis 的 標簽簡直是反人類設(shè)計:collection, item, open, close... 配置項多達七八個,而且為了防止集合為空導致 SQL 語法錯誤,通常還得在外面套一層,簡直令人窒息:

if>

而在 dbVisitor 中,利用 @{ifand} 和 @{in} 兩個規(guī)則的 嵌套使用,你只需要一行:

  @{ifand, !idList.isEmpty, id IN @{in, :idList}}

對比一下,這代碼量節(jié)省的可不是一點點,而是 降維打擊!

忘掉 , 忘掉逗號

在寫 Update 語句時,處理末尾的逗號是最煩人的。dbVisitor 的 @{set}規(guī)則完美解決,引擎會自動處理字段間的逗號:

WHERE id = #{id}

MyBatis 用了一大堆標簽來解決這個問題:

WHERE id = #{id}

?? 雖然 @{set} 規(guī)則很強大,但規(guī)則的判斷是依賴已經(jīng)生成的 SQL 進行推斷。

當規(guī)則沒有匹配時,一些意外情況:

WHERE id = :id

分支判斷的救星

MyBatis 的 - - 結(jié)構(gòu)冗長得令人發(fā)指,寫起來仿佛在填表。最大的麻煩在于即便是使用 @Select 注解仍然逃脫不了 XML 的魔咒。

                      @Param("content") String content);

dbVisitor 讓你用 SQL 的思維寫 SQL,更符合編程直覺。同樣的場景,dbVisitor 只需要這樣:

CASE 規(guī)則 IF-ELSE 模式

}

CASE 規(guī)則 Switch 模式 換一個例子:根據(jù) encryptMode 的值選擇加密方式。

}

像樂高積木一樣組合

規(guī)則引擎最強大的地方在于其 可組合性。規(guī)則可以像樂高積木一樣嵌套使用。這意味著你可以用 @{case} 的結(jié)果去驅(qū)動 @{and} 或者在 @{else} 里寫一組 @{if}

比如一個常見的權(quán)限控制場景:

  • 如果是管理員 (ADMIN),查詢所有數(shù)據(jù);

  • 如果是部門經(jīng)理 (MGR),查詢本部門數(shù)據(jù);

  • 如果是普通員工,只能查自己的數(shù)據(jù)。


}

注意看,外層的 @{and} 會自動處理連接詞:

  • 當 role 是 'ADMIN' 時,@{case} 輸出空,整個 @{and} 消失。

  • 當 role 是 'MGR' 時,內(nèi)部輸出 dept_id = ?,外層自動加上 AND。

這種自然的嵌套組合,讓你能用 SQL 結(jié)構(gòu)直接表達復雜的業(yè)務(wù)邏輯,而不是在 Java 代碼和 XML 之間反復橫跳。

這就結(jié)束了?

規(guī)則的強大之處在于無處不在。你不需要為了使用動態(tài) SQL 而強迫自己切換開發(fā)模式。無論你身處哪個層級,dbVisitor 的動態(tài)規(guī)則都能無縫集成。

1. 在 編程式 API (JdbcTemplate) 中使用

不需要 StringBuilder,不需要拼接字符串。

    "SELECT * FROM users @{and, name = :name}", args);

2. 在 聲明式 API (注解) 中使用

徹底擺脫 @Script 或者

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
當場驅(qū)逐!多特廢人動作惹全美暴怒!裝無辜,美網(wǎng)友:滾出NBA!

當場驅(qū)逐!多特廢人動作惹全美暴怒!裝無辜,美網(wǎng)友:滾出NBA!

林子說事
2026-03-01 08:56:15
神壇徹底崩塌!李莉被中情局盯上的謊言,該徹底戳穿了

神壇徹底崩塌!李莉被中情局盯上的謊言,該徹底戳穿了

老馬拉車莫少裝
2026-03-01 17:23:52
記者:賽后籃協(xié)主席、郭士強和趙睿都哭了,大家壓力確實很大

記者:賽后籃協(xié)主席、郭士強和趙睿都哭了,大家壓力確實很大

懂球帝
2026-03-01 21:41:53
恒生科技跌24%!現(xiàn)在要不要賣?

恒生科技跌24%!現(xiàn)在要不要賣?

雪球
2026-03-01 12:08:33
哈梅內(nèi)伊早就死了,根本沒躲進地堡,商量怎么讓步時被一鍋端

哈梅內(nèi)伊早就死了,根本沒躲進地堡,商量怎么讓步時被一鍋端

遁走的兩輪
2026-03-01 20:54:39
美軍瞞不住了!炸航母基地,炸11億美元雷達,幾十萬噸燃油被點燃

美軍瞞不住了!炸航母基地,炸11億美元雷達,幾十萬噸燃油被點燃

健身狂人
2026-03-01 18:17:15
2萬余名旅客滯留 阿聯(lián)酋政府將承擔因此產(chǎn)生費用

2萬余名旅客滯留 阿聯(lián)酋政府將承擔因此產(chǎn)生費用

看看新聞Knews
2026-03-01 18:15:18
特朗普聲稱:現(xiàn)在與伊朗達成協(xié)議“比一天前容易多了”

特朗普聲稱:現(xiàn)在與伊朗達成協(xié)議“比一天前容易多了”

參考消息
2026-03-01 12:58:06
好慘!香港知名演員新片激情戲被刪光,豐滿身材難現(xiàn)大銀幕

好慘!香港知名演員新片激情戲被刪光,豐滿身材難現(xiàn)大銀幕

眼底星碎
2026-03-01 11:31:34
為什么這次伊朗不升旗了?因為升旗的地方已經(jīng)被炸了

為什么這次伊朗不升旗了?因為升旗的地方已經(jīng)被炸了

怪口歷史的K先生
2026-02-28 17:12:58
瞧不起誰呢?湖人1節(jié)打花勇士!詹姆斯破喬丹紀錄,創(chuàng)3個歷史第一

瞧不起誰呢?湖人1節(jié)打花勇士!詹姆斯破喬丹紀錄,創(chuàng)3個歷史第一

毒舌NBA
2026-03-01 11:30:36
美“福特”號航母駛離希臘克里特島

美“福特”號航母駛離希臘克里特島

財聯(lián)社
2026-02-26 16:57:07
伊朗向美航母發(fā)射4枚導彈

伊朗向美航母發(fā)射4枚導彈

每日經(jīng)濟新聞
2026-03-01 22:32:10
鐵衛(wèi)90分鐘破僵局,萊奧自我救贖!AC米蘭2-0升班馬,下輪戰(zhàn)國米

鐵衛(wèi)90分鐘破僵局,萊奧自我救贖!AC米蘭2-0升班馬,下輪戰(zhàn)國米

釘釘陌上花開
2026-03-01 21:26:15
王一博跟親媽吵架綦美合勸他道歉,戀愛傳了8年,網(wǎng)友直呼磕到了

王一博跟親媽吵架綦美合勸他道歉,戀愛傳了8年,網(wǎng)友直呼磕到了

萌神木木
2026-02-28 13:57:34
媒體:中共強調(diào)“正確政績觀”釋放新信號

媒體:中共強調(diào)“正確政績觀”釋放新信號

參考消息
2026-03-01 16:21:53
新加坡大滿貫,莫雷加德犀利銳評樊振東,句句不提球技卻一針見血

新加坡大滿貫,莫雷加德犀利銳評樊振東,句句不提球技卻一針見血

清衣渡a
2026-03-01 15:00:09
以軍稱首次打擊伊朗首都中心地帶目標

以軍稱首次打擊伊朗首都中心地帶目標

新華社
2026-03-01 16:42:04
伊朗導彈襲擊約旦美軍基地

伊朗導彈襲擊約旦美軍基地

財聯(lián)社
2026-02-28 18:06:05
伊朗第六波導彈雨殺到,27 個美軍基地炸成火海:徹底攔不住了!

伊朗第六波導彈雨殺到,27 個美軍基地炸成火海:徹底攔不住了!

咣當?shù)厍?/span>
2026-03-01 18:15:50
2026-03-02 00:00:50
開源中國 incentive-icons
開源中國
每天為開發(fā)者推送最新技術(shù)資訊
7604文章數(shù) 34503關(guān)注度
往期回顧 全部

科技要聞

榮耀發(fā)布機器人手機、折疊屏、人形機器人

頭條要聞

媒體:美以能精準"斬首"背后 摩薩德的"手筆"令人咋舌

頭條要聞

媒體:美以能精準"斬首"背后 摩薩德的"手筆"令人咋舌

體育要聞

火箭輸給熱火:烏度卡又輸斯波教練

娛樂要聞

黃景瑜 李雪健坐鎮(zhèn)!38集犯罪大劇來襲

財經(jīng)要聞

中東局勢升級 如何影響A股、黃金和原油

汽車要聞

理想汽車2月交付26421輛 歷史累計交付超159萬輛

態(tài)度原創(chuàng)

房產(chǎn)
藝術(shù)
游戲
本地
家居

房產(chǎn)要聞

濱江九小也來了!集齊海僑北+哈羅、寰島...江東教育要炸了!

藝術(shù)要聞

2025年第二屆少兒美術(shù)教師作品展 | 油畫選刊

《寶可夢》新游熱銷登頂!模擬建造休閑風

本地新聞

津南好·四時總相宜

家居要聞

素色肌理 品意式格調(diào)

無障礙瀏覽 進入關(guān)懷版