MyBatis是目前最流行的JDBC持久層框架,著名的ssm框架中的m。關(guān)于springboot集成mybatis可以參考本系列前面的文章(003和004)。關(guān)于MyBatis不再介紹。
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。
MyBatis-Plus特性
無侵入:只做增強(qiáng)不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/p>
強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求
支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯
支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數(shù)據(jù)庫
支持主鍵自動生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
支持 XML 熱加載:Mapper 對應(yīng)的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作
支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持關(guān)鍵詞自動轉(zhuǎn)義:支持?jǐn)?shù)據(jù)庫關(guān)鍵詞(order、key......)自動轉(zhuǎn)義,還可自定義關(guān)鍵詞
內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作
內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預(yù)防 Sql 注入攻擊
框架結(jié)構(gòu)

關(guān)于其它,可以參考官方文檔。
項目依賴
接下來開始寫代碼例子,首先創(chuàng)建一個項目,依賴如下:

可以看到除了正常的ssm依賴之外,只多了一個mybatis-plus-boot-starter依賴。
注意:針對目前的版本,有一點值得注意,我們在使用MyBatis的時候,習(xí)慣使用的分頁組件是pagehelper,但是在使用mybatis plus的時候,如果引入pagehelper依賴,會讓mybatis plus的分頁發(fā)生錯誤,所以,使用mybatis plus不要再引入pagehelper。
單表增刪改查
MyBatis Plus多表的復(fù)雜的SQL操作同mybatis沒有太大的區(qū)別,同樣是麻煩的SQL語句和方法調(diào)用,但是單表簡化了很多。上面的特性中提到,MyBatis Plus(以下簡稱mp)僅需少量的配置,即可實現(xiàn)單表的大部分crud操作。首先我們在配置文件中只配置簡單的數(shù)據(jù)源,其它不做任何配置:

在啟動類中,增加一個mapper掃描注解:
@MapperScan("mp.mapper")
mp.mapper為mapper的接口包路徑。這個注解是MyBatis原生的。
簡單的配置基本完成了,下面開始寫業(yè)務(wù)代碼,首先看實體類:

簡單的用戶信息,上面的注解是基于lombok,如果不習(xí)慣可以使用get/set。
再來看mapper:

mapper只需要繼承BaseMapper即可,不需要寫任何代碼。再來看service類:

可以看到service單表操作只需要繼承ServiceImpl即可,也不需要寫任何代碼,接下來看一下controller中對應(yīng)的接口:

簡單的單表增刪改查就寫好了,與原生的MyBatis相比,沒有SQL語句,mapper接口和service類幾乎是零代碼,所以說mp是MyBatis的增強(qiáng)工具。通過上面可以看到,直接調(diào)用userService里面有很多實現(xiàn)好的方法,這些方法都在ServiceImpl中,下面簡單看一下都有哪些:

可以看到,ServiceImpl里面包含了很多有用的單表crud方法(具體內(nèi)容查看源碼),這種做法類似于JPA,以前很多人抱怨說MyBatis在單表的時候也要寫大量的SQL語句,現(xiàn)在有了mp,這些都不再是問題。
現(xiàn)在啟動項目,簡單運行一下上面四個接口,先看新增方法:


修改方法:


查詢方法:

刪除方法:


四個接口都沒有問題。其它自帶的方法可以自行學(xué)習(xí)測試。
分頁查詢
分頁需要加入分頁插件,在springboot的啟動類中加入如下方法:

如果不加返回的分頁數(shù)據(jù)的總頁數(shù)和總記錄數(shù)會有問題,接下來先看單表的簡單的分頁查詢。

返回的數(shù)據(jù)如下:

這是service中調(diào)用的selectPage方法,返回Page對象,需要傳入兩個參數(shù),第一個主要是當(dāng)前頁碼和每頁記錄數(shù),第二個Wrapper主要用來組合條件,也是實體包裝器,用于處理 sql 拼接,排序,實體參數(shù)查詢等!實體包裝器 EntityWrapper 繼承 Wrapper。簡單的實例如下:

或者:

具體的使用方法如下:

不僅在分頁查詢中,在單表的列表查詢selectList方法中,也可以傳參數(shù)wrapper,這樣我們對單表的操作基本上就不用寫service代碼和SQL語句了。其它詳細(xì)內(nèi)容可以參考官方文檔。
單表的分頁十分好實現(xiàn),雖然mp封裝了單表的大部分操作,但是就像JPA一樣,復(fù)雜的情況還是需要手寫SQL,下面看一下自定義SQL的分頁。首先配置SQL語句的xml文件的位置:
mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
然后在對應(yīng)的的目錄下創(chuàng)建userMapper.xml文件,并寫一個SQL:

可以看到SQL語句的定義和以前并沒有什么區(qū)別。接下來在mapper接口中定義方法:

方法的定義幾乎和以前一樣,唯一的區(qū)別是參數(shù)列表的第一個參數(shù)增加了一個Pagination類型的page,這是翻頁對象,可以作為 xml 參數(shù)直接使用,傳遞參數(shù) Page 即自動分頁。
然后看一下service的調(diào)用方式:

service調(diào)用mapper雖然和以前有區(qū)別,但也很簡單。
最后是controller調(diào)動service,這里就沒有什么特別的了:

最后重啟項目,測試接口:

可以看到自定義SQL的分頁也很容易實現(xiàn),復(fù)雜的SQL同樣如此。
執(zhí)行效率插件
接下來介紹一個實用的執(zhí)行效率插件,即性能分析攔截器,用于輸出每條 SQL 語句及其執(zhí)行時間。在springboot中只需要在啟動類中加入如下方法:

這個時候,執(zhí)行任何數(shù)據(jù)庫操作都會在控制臺打印SQL語句和執(zhí)行的時間:

是一個非常實用的插件!
注意!該插件只用于開發(fā)環(huán)境,不建議生產(chǎn)環(huán)境使用。。。
官方還提供了很多很多的插件:

包括讀寫分離,idea快速開發(fā)等等都非常實用,有興趣可以自行學(xué)習(xí),此處不再一一列舉。
代碼地址:?https://gitee.com/blueses/spring-boot-demo