一、MybatisPlusMax簡介 MybatisPlusMax是MybatisPlus的增強包,秉承只拓展不修改的理念,對MybatisPlus做增強。 正如MybatisPlus是對MyBatis的增強,MybatisPlusMax是對MybatisPlus的增強,拓展理念一脈相承。 Myba ...
一、MybatisPlusMax簡介
MybatisPlusMax是MybatisPlus的增強包,秉承只拓展不修改的理念,對MybatisPlus做增強。
正如MybatisPlus是對MyBatis的增強,MybatisPlusMax是對MybatisPlus的增強,拓展理念一脈相承。
MybatisPlus依然進入軟體成熟期,對其進行微小的修改會慎之又慎,向其提交修改PR周期較長,基於此考慮,為了更好的使用MybatisPlus,作者決定拓展第三方功能包。
當MybatisPlusMax代碼逐步成熟後,作者願意一次性捐獻給MybatisPlus官方團隊,以方便用戶更好的使用MybatisPlus。
二、與MybatisPlus的淵源
(一)MyBatis粉
早期的作者也是MyBatis粉,如果你是從拼接SQL時代過來的,受夠了在Java代碼中拼接SQL字元串,那麼MyBatis絕對讓你愛不釋手。
隨著MyBatis的重度使用,也暴露出一些問題:訪問資料庫極其啰嗦,單表CURD兜兜轉轉需要寫一大堆代碼,每個項目有很多張表,每個開發會做很多項目,此時的MyBatis從開髮端來講需要完善。
(二)MybatisPlus初版
MybatisPlus敏銳的發現MyBatis的痛點,著手對MyBatis重覆業務代碼進行封裝,於是便形成了早期版本MybatisPlus。
早期的MyBatisPlus欄位名等魔法值
充斥著Java代碼里,並且為了構建查詢條件,需要編寫及其啰嗦的代碼,很多MyBatis使用者對此嗤之以鼻。被噴的原因如下:大量的欄位名魔法值充斥在Java代碼里,與早期的拼接SQL字元串有何區別;非常簡單的查詢條件,在XML文件中很容易完成,使用MybatisPlus構造查詢條件啰啰嗦嗦,不知所云。
早期的MybatisPlus為了改進MyBatis的使用的想法是好的,可是在落地實踐過程中帶來了更大的問題,因此處於不溫不火的狀態。
(三)MybatisPlus新生
Java 8帶來了Lambda表達式,為MybatisPlus重構代碼帶來了新的基礎能力。MybatisPlus基於Java 8新特性進行代碼重構,為其帶來了新生,使用Lambda語法,幹掉了Java代碼里的欄位名等魔法值,此時的MybatisPlus真正展示出吸引力。
作者粉的是Lambda表達式版本的MybatisPlus,不管是查詢條件的構建,還是欄位的選取,均使用Lambda表達式(方法引用)來完成,Java代碼變得清爽。
方法引用性能
使用方法引用
來替換欄位名
,是否會產生性能問題呢?會也不會。會是因為經過一層包裝,性能確實有損耗,不會是因為MybatisPlus在使用反射的地方使用了緩存,有效的解決了中間過程耗時操作,因此可以認為Lambda版的MybatisPlus的性能略有下降。用略微下降一點性能的代價置換開發的靈活性,這一點是值得的。
況且現代伺服器硬體逐年提高,從系統總體而言考慮,利大於弊。
基於方法引用
實現編碼,在遇到代碼重構是有多爽就不用多說了。小步快跑、敏捷開發等,造成的屎山代碼不勝枚舉,代碼重構的地位變得愈發重要。
三、作者的努力
作者是MybatisPlus粉,因此在系統組件選擇態度更為積極。
(一)零SQL函數式編程時代
在Lambda表達式加持下的MybatisPlus,零SQL函數式編程成為了可能。零SQL是只儘量少顯示的編寫SQL語句,能不寫就不寫,對於疑難雜症,退回使用MyBatis XML更為方便,此時也不能一條道走到黑。
(二)MybatisPlusMax
MybatisPlusMax
不是新內容新,是從common包中抽離出來的代碼,方便用戶更好的使用和解藕。
1、DAO緩存
給DAO層透明化的增加緩存,能夠極大的提高介面的響應效率,透明化意味著不知不覺間具備了緩存的能力,業務代碼零感知。這裡使用的是Redis分散式緩存,Redis是繼Mysql之後必備的組件,因此預設緩存使用Redis分散式緩存。
有關DAO更多內容,請查看視頻教程增強MybatisPlus!一行代碼整合Redis分散式緩存!
2、自增自減零SQL編程
通過自定義CustomLambdaUpdateWrapper
包裝器,實現零SQL編程。
public boolean updateUserAge(Long userId) {
CustomLambdaUpdateWrapper<User> wrapper = new CustomLambdaUpdateWrapper<>();
wrapper.incr(User::getAge, 1).eq(User::getUserId, userId);
return update(wrapper);
}
視頻教程自增自減
3、複雜業務報表
通過封裝WrapperUtils
工具類,實現and
和or
交替出現時複雜業務報表查詢。具體使用場景舉例:
((industry = ?) OR (industry = ?)) AND ((round = ?) OR (round = ?) OR (round = ?))
(三)多表連接查詢
在我們使用Lambda風格搞定單表查詢之後,因業務需要,多表連接查詢必不可少!為此作者在此方面也做了不少努力,既然選擇零SQL編程,那麼便堅持到底。
在這裡需要說明幾點,有不少聲音認為,單表使用MybatisPlus,多表使用MyBatis,有這種想法的朋友可以更近一步,不然便是自欺欺人,掛著MybatisPlus之名乾MyBatis之實。
實際上,MyBatis使用join
來完成連表查詢,本身是有性能缺陷的,資料庫數據量膨脹越來越快,join
連表查詢的弊端愈發明顯。《阿裡巴巴開發者手冊》明令禁止使用join
查詢,你還在堅持什麼呢?
以Lambda版MybatisPlus單表查詢為基礎,通過Java記憶體拼裝,完成多表連接查詢是全新的選擇。視頻教程如下:
- MybatisPlus多表連接查詢
- MybatisPlus多表連接查詢合集說明
- MybatisPlus多表連接查詢一對一單條記錄查詢
- MybatisPlus多表連接查詢一對一查詢列表數據
- MybatisPlus多表連接查詢一對一分頁查詢數據
- MybatisPlus多表連接查詢一對多查詢列表數據
- MybatisPlus多表連接查詢一對多分頁查詢數據
- MybatisPlus多表連接查詢結語總結
- 用代碼生成器自動化實現MybatisPlus多表連接查詢
- MybatisPlus多表連接查詢過濾敏感欄位屬性
- MyBatis多表連接查詢開啟二級緩存臟數據案例分析
- MybatisPlus多表連接查詢之二級緩存
(四)零SQL分組查詢
分組查詢由於涉及到新增欄位,因此普通的單表查詢並不合適,不滿足DO
與資料庫表結構一一對應的關係。作者通過對MybatisPlus源代碼的閱讀,找到了依然能夠像單表查詢的形式處理分組查詢。
視頻教程
- MybatisPlus Lambda表達式 聚合查詢 分組查詢 lambdaQuery groupby
- MybatisPlus Lambda分組查詢 優雅高效統計部門人數
- MybatisPlus Lambda表達式 聚合查詢 分組查詢 COUNT SUM AVG MIN MAX
(五)MybatisPlus代碼生成器
只要你想偷懶,那麼Java代碼生成器便是偷懶的利器,Java代碼生成器以MybatisPlus為基礎,通過在全局yml
文件中復用資料庫,讀取資料庫元數據信息,一件生成domain、mapper、service、controller等Spring MVC風格代碼,以單表查詢為主,兼顧多表連接查詢,是你的開發好幫手。
文字教程MybatisPlus代碼生成器
視頻教程
四、後記
作者叫賽泰先生
,主要技術分享平臺在B站,是一位MybatisPlus粉,基於MybatisPlus做實戰技術分享,希望能對喜歡MybatisPlus的你有所幫助。
另外有MybatisPlus技術學習群,添加微信dream4s
付費進群(個位數),請註明來意。
喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站。