使用 MyBatis-Plus 加強 MyBatis

王嘉鴻 2019/12/13 15:48:35
1930

1. 前言

       這幾年,Java Spring 開發中,使用資料庫ORM 技術的選擇,幾乎是以Spring Data 為主,MyBatis處於相對弱勢。

    然而在實務使用上,筆者對於全面使用Java程式來產生SQL這件事並不完全贊同,尤其遇到因功能需求經常變動,

    需要動態方式組成SQL(where condition 需要判斷是否放入)或是比較複雜的table join,直接使用SQL反而可發揮比較好的系統效能。

    雖然Spring Data其實是可以手寫SQL,不過要做到這樣,必須在annotation中放入SQL,反而會增加後續維護上的困難。

    因此,如何兼顧程式可讀性與充分利用資料庫效能,同時又能降低維護難度,往往讓系統設計人員左右為難。

    幸好,MyBatis-Plus的出現似乎可以幫我們簡化使用 MyBatis 的複雜程度,有基本的 CRUD 又可同時用比較好的方式處理複雜的SQL,

    同時,重點是MyBatis-Plus宣稱不會改變使用方式,只是加強,值得我們實作研究一下。

 

2. 環境

   IDE: sts-4.4.0.RELEASE

   JDK: 1.8

   Framework: Spring-boot.2.1.10.RELEASE

   Build Tool: Maven 3

   Server: tomcat8

   

3. 實作

3.1    建立 Spring Boot 專案

          com.baomidou.mybatis-plus – 本文章主角

          com.baomidou.mybatis-plus-generator - generator code 會使用到

          freemarker - generator code 所使用的template

           pom.xml配置

3.2     Generator Code

將需要操作的table generator 出來

        

你會看到會有 controllerservice等程式我們不選擇使用,每個table都有三個程式對應 entrymapperxml

跟使用 MyBatis 一樣差別為 CRUD不會出現在每個xml裡面大幅減少SQL的產生

3.3  進行測試

開始前須要做點小變更不然無法使用基本提供的服務

使用 MybatisSqlSessionFactoryBean

3.3.1

使用基本提供的服務來做DB查詢,把debug打開看SQL執行的情況

 

3.3.2

如果你的table pk設計為自動遞增,generator code 時會自動幫你加上 IdType.AUTO

3.3.3

看來基本提供的服務沒問題,那會影響之前的使用方式嗎? 測試一下

         

3.3.4

提供分頁服務,這邊需要做點調整分頁功能才會生效

官網中的教學,測試後發現沒有效果

換個做法

 

在method中增加 Page 物件原SQL都不需要做異動,觀察SQL會發現自動幫你增加limit 語法

3.3.5

如果你有使用關聯性查詢,可能會這樣設定

 

使用上沒有問題,但如果沒有加上 @TableField(exist = false) ,回頭使用提供的基本服務會掛掉,因為他會認為這也是 table 的欄位

3.3.6

Generator code 需求,如果基本的東西無法滿足你的需求

例如: 下 SQL 操作 table 時需要加上 schema 可以通過下列設定

觀察SQL會自動幫你加上

但問題來了我需要每隻都自己加上嗎?

如果不想那我們來看看 template 的內容是甚麼

因為官網沒有提供 template的樣式但我們可以去jar中找到 template

如果你看到的註解是亂碼的話請將 IDE 編碼設定改成 UTF-8,關掉之後再開啟就會正常

看來官方沒有提供這功能,所以我們需要自己弄一個出來

l   建立相同檔名放置 src\main\resources\templates\

l   將原本內容 copy 一份

l   修改內容,放入自訂義的參數名稱(後面會說如何放入,自訂義參數須從 cfg 中取得),為了方便所以把 if 判斷拿掉

修改過後的檔案

 

   l   修改先前的 generator code 的程式,將自定義中的參數設定進去

       

 

   l   重新執行,這樣就會依照修改 template 樣式輸出,所以你可以客製自己的 template 滿足你的需求

           

 

4. 總結

       MyBatis-Plus 還有許多功能可以使用,提供類似 Spring Data CRUD的快速操作又不會產生大量的 

    SQL (inser、update、delete、selectById),同時保留MyBatis 手寫 SQL 的便利性跟彈性,

    甚至可以完全拋棄手寫 SQL 不過這樣我想我會選擇Spring Data,

    所以打算用 MyBatis 作為專案 ORM 的技術可考慮 MyBatis-Plus 幫你做到加強的部分是個不錯的選擇。

 

參考網站:

MyBatis-Plus

 

 

 

 

王嘉鴻