1. 程式人生 > 其它 >mybatis-plus思維導圖,讓mybatis-plus不再難懂

mybatis-plus思維導圖,讓mybatis-plus不再難懂

mybatis-plus與mybatis

#####mybatis

 Mybatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

回顧mybatis的特點.png

但mybatis有個讓我比較頭疼的一個問題是sql工作量很大,尤其是欄位多的時候。雖然說單表的增刪改查操作可以通過mybatis generator工具來生成(或者自己寫模板工具生成),但專案開發的過程中總免不了要新新增新欄位,這些工具就幫不了我了,我得把新欄位寫到原來的所有增刪改查的sql中。這是個痛苦的過程,特別是當你重複了很多次之後。

mybatis的單表操作也是賊麻煩的事,因為篩選的條件可能會各種各樣,所以你不得不寫很多動態sql來相容查詢條件,這也讓我不能集中精力去處理業務。

每當這時候,我懷念Hibernate了。嘿嘿,Hibernate加欄位就賊簡單,單表操作也是賊方便。但我依然不喜歡用Hibernate,哈哈。

#####mybatis-plus

而mybatis-plus這樣一個框架,一種集mybatis與hibernate的優點一起的框架。它提供了hibernate的單表CRUD操作的方便同時,又保留了mybatis的特性。

先來看看官方怎麼解釋mybatis-plus的:

  • Mybatis-Plus(簡稱MP)是一個Mybatis的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
Mybatis-Plus與Mybatis.png
  • 我們的願景是成為Mybatis最好的搭檔,就像 Contra Game 中的1P、2P,基友搭配,效率翻倍。
Contra Game的1P、2P.png

帶問題去學習,請思考

  • mybatis-plus怎麼實現單表URUD操作?
  • mybatis-plus的底層實現原理是什麼?
  • mybatis-plus與其他同類框架如mybatis helper有很什麼優勢?
  • 如何整合mybatis-plus快速搭建一個spring boot專案。

特性

image.png

從上圖可以看出,mybatis-plus不僅僅封裝了基本的CRUD操作,還內建了防SQL注入操作、常用的分頁外掛,還有我最喜歡的ActiveRecord模式。

用過jfinal的人應該都知道ActiveRecord是啥。Active Record 是一種資料訪問設計模式,它可以幫助你實現資料物件Object到關係資料庫的對映。

常用實體註解

MP通過ORM模式封裝了常用的CRUD操作,自然少不了實體註解,先來看看都有哪些註解

MP常用實體註解.png

其中實體無註解化設定可以如下處理:

  • 當資料庫的表字段名是駝峰命名時無需註解處理。
  • 或者全域性配置: 下劃線命名 dbColumnUnderline 設定 true , 大寫 isCapitalMode 設定 true

但其實我壓根就沒管過手寫過這些註解,使用mp程式碼生成器自動生成主體後直接覆蓋原來的就行了,減少人工的失誤,方便快捷。至於@Version與@KeySequence這兩個註解,貌似我還真沒用過。嘿嘿。。。

簡化 CRUD

前面已經說了mp已經簡化了mybatis的單表基本操作,先來看看。

MP增刪改查.png

相比兩種寫法,我更喜歡ActiveRecord的模式寫法,因為我不用注入userMapper,new了一個物件之後直接呼叫方法操作就行了。

複雜的查詢也很簡單,新建一個EntityWrapper作為查詢物件,Wrapper介面封裝了很多常用的方法。幾乎sql能寫出來的條件呼叫Wrapper的方法就能表現出來。

篩選條件Wrapper的方法.png

架構原理

參考答案略。

不過我建議你去mp官網或者這裡看看,哈哈 -> mybatis-plus 實踐及架構原理.pdf

mybatis plus程式碼生成器 與 mybatis generator

說起mybatis plus程式碼生成器的程式碼,我記得以前這這篇文章中介紹過

現在再拿來用下哈。原理其實很簡單,定義好velocity模板(當然你也可以自定義),然後傳引數渲染模板生成對應的檔案。

我建議你生成的位置最好不要直接覆蓋原來的檔案,你可能已經有過修改,直接覆蓋的話會導致丟失。

mp程式碼生成器原理.png

而mybatis generator生成的程式碼就是基本的增刪改查和實體。模板好像改不了,靈活性明顯不夠。

mp外掛拓展

mp不僅僅幫我們實現了基本的增刪改查操作,同時還擴充套件了很多實用的外掛。讓開發的過程更加簡單。

外掛拓展.png

#####分頁外掛

按如下步驟:

  • 自定義查詢語句分頁(自己寫sql/mapper)<plugins> <!-- | 分頁外掛配置 | 外掛提供二種方言選擇:1、預設方言 2、自定義方言實現類,兩者均未配置則丟擲異常! | overflowCurrent 溢位總頁數,設定第一頁 預設false | optimizeType Count優化方式 ( 版本 2.0.9 改為使用 jsqlparser 不需要配置 ) | --> <!-- 注意!! 如果要支援二級快取分頁使用類 CachePaginationInterceptor 預設、建議如下!! --> <plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor"> <property name="sqlParser" ref="自定義解析類、可以沒有" /> <property name="localPage" value="預設 false 改為 true 開啟了 pageHeper 支援、可以沒有" /> <property name="dialectClazz" value="自定義方言類、可以沒有" /> </plugin> </plugins>//Spring boot方式 @EnableTransactionManagement @Configuration @MapperScan("com.baomidou.cloud.service.*.mapper*") public class MybatisPlusConfig { /** * 分頁外掛 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
  • spring 注入 mybatis 配置分頁外掛
  • UserMapper.java 方法內容public interface UserMapper{//可以繼承或者不繼承BaseMapper /** * <p> * 查詢 : 根據state狀態查詢使用者列表,分頁顯示 * </p> * * @param page * 翻頁物件,可以作為 xml 引數直接使用,傳遞引數 Page 即自動分頁 * @param state * 狀態 * @return */ List<User> selectUserList(Pagination page, Integer state); }public Page<User> selectUserPage(Page<User> page, Integer state) { return page.setRecords(userMapper.selectUserList(page, state)); }<select id="selectUserList" resultType="User"> SELECT * FROM user WHERE state=#{state} </select>#####邏輯刪除外掛
  • UserServiceImpl.java 呼叫翻頁方法,需要 page.setRecords 回傳給頁面
  • UserMapper.xml 等同於編寫一個普通 list 查詢,mybatis-plus 自動替你分頁

邏輯刪除的效果 ---> 會在mp自帶查詢和更新方法的sql後面,追加『邏輯刪除欄位』=『LogicNotDeleteValue預設值』 刪除方法: deleteById()和其他delete方法, 底層SQL呼叫的是update tbl_xxx set 『邏輯刪除欄位』=『logicDeleteValue預設值』

配置如下:

  1. 修改 整合 全域性注入器為 LogicSqlInjector@Bean public GlobalConfiguration globalConfiguration() { GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector()); conf.setLogicDeleteValue("-1"); conf.setLogicNotDeleteValue("1"); conf.setIdType(2); return conf; }mybatis-plus: mapper-locations: classpath:/mapper/*Mapper.xml #實體掃描,多個package用逗號或者分號分隔 typeAliasesPackage: com.baomidou.springboot.entity typeEnumsPackage: com.baomidou.springboot.entity.enums global-config: #主鍵型別 0:"資料庫ID自增", 1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)", 3:"全域性唯一ID UUID"; id-type: 2 #欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 db-column-underline: true #邏輯刪除配置 logic-delete-value: 0 logic-not-delete-value: 1 sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  2. application.yml全域性注入值: logicDeleteValue // 邏輯刪除全域性值 logicNotDeleteValue // 邏輯未刪除全域性值
  3. 邏輯刪除的欄位需要註解 @TableLogic@TableName("tbl_user") public class UserLogicDelete { private Long id; ... @TableField(value = "delete_flag") @TableLogic private Integer deleteFlag; }spring整合mybatis-plus的優秀案例