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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...