MybatisPlus實戰技術分享合集 代碼生成器 多表連接查詢 分組查詢 一口氣幹完

来源:https://www.cnblogs.com/javazhishitupu/archive/2023/01/10/17040237.html
-Advertisement-
Play Games

一、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工具類,實現andor 交替出現時複雜業務報表查詢。具體使用場景舉例:

((industry = ?) OR (industry = ?)) AND ((round = ?) OR (round = ?) OR (round = ?))

MybatisPlus·業務報表·複雜SQL

(三)多表連接查詢

在我們使用Lambda風格搞定單表查詢之後,因業務需要,多表連接查詢必不可少!為此作者在此方面也做了不少努力,既然選擇零SQL編程,那麼便堅持到底。

在這裡需要說明幾點,有不少聲音認為,單表使用MybatisPlus,多表使用MyBatis,有這種想法的朋友可以更近一步,不然便是自欺欺人,掛著MybatisPlus之名乾MyBatis之實。

實際上,MyBatis使用join來完成連表查詢,本身是有性能缺陷的,資料庫數據量膨脹越來越快,join連表查詢的弊端愈發明顯。《阿裡巴巴開發者手冊》明令禁止使用join查詢,你還在堅持什麼呢?

以Lambda版MybatisPlus單表查詢為基礎,通過Java記憶體拼裝,完成多表連接查詢是全新的選擇。視頻教程如下:

(四)零SQL分組查詢

分組查詢由於涉及到新增欄位,因此普通的單表查詢並不合適,不滿足DO與資料庫表結構一一對應的關係。作者通過對MybatisPlus源代碼的閱讀,找到了依然能夠像單表查詢的形式處理分組查詢。

視頻教程

(五)MybatisPlus代碼生成器

只要你想偷懶,那麼Java代碼生成器便是偷懶的利器,Java代碼生成器以MybatisPlus為基礎,通過在全局yml文件中復用資料庫,讀取資料庫元數據信息,一件生成domain、mapper、service、controller等Spring MVC風格代碼,以單表查詢為主,兼顧多表連接查詢,是你的開發好幫手。

文字教程MybatisPlus代碼生成器

視頻教程

四、後記

作者叫賽泰先生,主要技術分享平臺在B站,是一位MybatisPlus粉,基於MybatisPlus做實戰技術分享,希望能對喜歡MybatisPlus的你有所幫助。

另外有MybatisPlus技術學習群,添加微信dream4s付費進群(個位數),請註明來意。

喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文簡介 點贊 + 關註 + 收藏 = 學會了 學習 Fabric.js,我的建議是看文檔不如看 demo。 本文實現的功能:將元素拖進到畫布中並生成對應的圖形或圖片。 效果如下圖所示: 思路 要實現以上效果,需要考慮以下幾點: 元素有拖拽功能。 能在畫布中生成對應的元素。 畫佈有可能縮放。 畫佈有 ...
  • 儘量不要用== ==的比較過程 以 [] == ![] 為例 左邊 [] 是個數組 右邊 ![] 是個表達式,表示對數組取反,需要對數組進行布爾判定,數組是對象所以是true,取反之後為false,所以就相當於比較 == 兩邊數據類型不一樣會將數據轉變成原始類型 ,原始類型有 null 、 unde ...
  • 路線規劃 簡介 路線規劃常用於出行路線的提前預覽,我們提供4種類型的路線規劃,分別為:駕車、步行、公交和騎行,滿足各種的出行場景。 高德開放平臺 本例是駕車路線規劃功能和位置選擇地圖api:chooseLocation 示例: 1、在頁面的 js 文件中,實例化 AMapWX 對象,請求進行駕車路線 ...
  • 前一段時間做項目,頻繁使用到上傳圖片組件,而且只上傳一個封面,於是想著自定義一個圖片封面上傳組件。先來看一下效果: 第一張圖片是上傳之前,第二張圖片是上傳成功後,第3張圖片是滑鼠放上去之後的效果! 首先整理需求,圖片上傳我們使用照片牆的方式,只能上傳一張圖片,圖片上傳成功後不能繼續上傳,如果想要更換 ...
  • 電銷是什麼?就是坐席拿著電話給客戶打電話嗎?no no no,讓我們一起走進京音平臺之電銷系統。 京音平臺2020年初開始建設,過去的兩年多的時間里,經歷了跌宕起伏,有經驗、有教訓,整體來說平臺經歷了人工、自動化階段,目前處於初步智能化階段,希望可以將過去的一些心路歷程分享給大家,共同交流、共同進... ...
  • 1高階函數 1.1 數學概念 回顧下數學知識: y=f(x) 這是最開始接觸的普通函數 y=g(f(x)) 這個就是我們接觸到的高階函數 在數學和電腦科學中,高階函數至少應當是滿足下麵一個條件的函數: 1)接受一個或者多個函數作為參數 2)輸出一個函數 程式中我們的高階函數也類似 示例計數器的函數 ...
  • Redis 數據結構-雙向鏈表 最是人間留不住,朱顏辭鏡花辭樹。 1、簡介 Redis 之所以快主要得益於它的數據結構、操作記憶體資料庫、單線程和多路 I/O 復用模型,進一步窺探下它常見的五種基本數據的底層數據結構。 Redis 常見數據類型對應的的底層數據結構。 String:簡單動態字元串。 L ...
  • 前言 今天給大家介紹的是Python爬蟲批量下載相親網站圖片數據,在這裡給需要的小伙伴們代碼,並且給出一點小心得。 首先是爬取之前應該儘可能偽裝成瀏覽器而不被識別出來是爬蟲,基本的是加請求頭,但是這樣的純文本數據爬取的人會很多,所以我們需要考慮更換代理IP和隨機更換請求頭的方式來對相親網站圖片數據進 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...