MyBatis是目前最流行的JDBC持久層框架,著名的ssm框架中的m寝并。關(guān)于springboot集成mybatis可以參考本系列前面的文章(003和004)羊苟。關(guān)于MyBatis不再介紹箫踩。
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具爱态,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)班套、提高效率而生肢藐。
MyBatis-Plus特性
無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響吱韭,如絲般順滑
損耗小:啟動即會自動注入基本 CURD,性能基本無損耗鱼的,直接面向?qū)ο蟛僮?/p>
強大的 CRUD 操作:內(nèi)置通用 Mapper理盆、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作凑阶,更有強大的條件構(gòu)造器猿规,滿足各類使用需求
支持 Lambda 形式調(diào)用:通過 Lambda 表達式,方便的編寫各類查詢條件宙橱,無需再擔心字段寫錯
支持多種數(shù)據(jù)庫:支持 MySQL姨俩、MariaDB、Oracle师郑、DB2环葵、H2、HSQL宝冕、SQLite张遭、Postgre、SQLServer2005地梨、SQLServer 等多種數(shù)據(jù)庫
支持主鍵自動生成:支持多達 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence)菊卷,可自由配置,完美解決主鍵問題
支持 XML 熱加載:Mapper 對應(yīng)的 XML 支持熱加載宝剖,對于簡單的 CRUD 操作洁闰,甚至可以無 XML 啟動
支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持關(guān)鍵詞自動轉(zhuǎ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)置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷捌显,也可自定義攔截規(guī)則茁彭,預防誤操作
內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊
框架結(jié)構(gòu)
關(guān)于其它扶歪,可以參考官方文檔理肺。
項目依賴
接下來開始寫代碼例子,首先創(chuàng)建一個項目善镰,依賴如下:
可以看到除了正常的ssm依賴之外妹萨,只多了一個mybatis-plus-boot-starter依賴。
注意:針對目前的版本炫欺,有一點值得注意乎完,我們在使用MyBatis的時候,習慣使用的分頁組件是pagehelper品洛,但是在使用mybatis plus的時候树姨,如果引入pagehelper依賴,會讓mybatis plus的分頁發(fā)生錯誤桥状,所以帽揪,使用mybatis plus不要再引入pagehelper。
單表增刪改查
MyBatis Plus多表的復雜的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庐完,如果不習慣可以使用get/set钢属。
再來看mapper:
mapper只需要繼承BaseMapper即可,不需要寫任何代碼门躯。再來看service類:
可以看到service單表操作只需要繼承ServiceImpl即可淆党,也不需要寫任何代碼,接下來看一下controller中對應(yīng)的接口:
簡單的單表增刪改查就寫好了讶凉,與原生的MyBatis相比染乌,沒有SQL語句,mapper接口和service類幾乎是零代碼懂讯,所以說mp是MyBatis的增強工具荷憋。通過上面可以看到,直接調(diào)用userService里面有很多實現(xiàn)好的方法褐望,這些方法都在ServiceImpl中勒庄,下面簡單看一下都有哪些:
可以看到,ServiceImpl里面包含了很多有用的單表crud方法(具體內(nèi)容查看源碼)瘫里,這種做法類似于JPA锅铅,以前很多人抱怨說MyBatis在單表的時候也要寫大量的SQL語句,現(xiàn)在有了mp减宣,這些都不再是問題。
現(xiàn)在啟動項目玩荠,簡單運行一下上面四個接口漆腌,先看新增方法:
修改方法:
查詢方法:
刪除方法:
四個接口都沒有問題。其它自帶的方法可以自行學習測試阶冈。
分頁查詢
分頁需要加入分頁插件闷尿,在springboot的啟動類中加入如下方法:
如果不加返回的分頁數(shù)據(jù)的總頁數(shù)和總記錄數(shù)會有問題,接下來先看單表的簡單的分頁查詢女坑。
返回的數(shù)據(jù)如下:
這是service中調(diào)用的selectPage方法填具,返回Page對象,需要傳入兩個參數(shù)匆骗,第一個主要是當前頁碼和每頁記錄數(shù)劳景,第二個Wrapper主要用來組合條件,也是實體包裝器碉就,用于處理 sql 拼接盟广,排序,實體參數(shù)查詢等瓮钥!實體包裝器 EntityWrapper 繼承 Wrapper筋量。簡單的實例如下:
或者:
具體的使用方法如下:
不僅在分頁查詢中烹吵,在單表的列表查詢selectList方法中,也可以傳參數(shù)wrapper桨武,這樣我們對單表的操作基本上就不用寫service代碼和SQL語句了肋拔。其它詳細內(nèi)容可以參考官方文檔。
單表的分頁十分好實現(xiàn)呀酸,雖然mp封裝了單表的大部分操作凉蜂,但是就像JPA一樣,復雜的情況還是需要手寫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)菜循,復雜的SQL同樣如此。
執(zhí)行效率插件
接下來介紹一個實用的執(zhí)行效率插件申尤,即性能分析攔截器癌幕,用于輸出每條 SQL 語句及其執(zhí)行時間。在springboot中只需要在啟動類中加入如下方法:
這個時候昧穿,執(zhí)行任何數(shù)據(jù)庫操作都會在控制臺打印SQL語句和執(zhí)行的時間:
是一個非常實用的插件勺远!
注意!該插件只用于開發(fā)環(huán)境时鸵,不建議生產(chǎn)環(huán)境使用胶逢。。饰潜。
官方還提供了很多很多的插件:
包括讀寫分離初坠,idea快速開發(fā)等等都非常實用,有興趣可以自行學習囊拜,此處不再一一列舉某筐。
代碼地址:?https://gitee.com/blueses/spring-boot-demo