1. 程式人生 > >MyBatisPlus進階筆記

MyBatisPlus進階筆記

5.程式碼生成器  

5.1 程式碼生成器介紹

1) MP 提供了大量的自定義設定,生成的程式碼完全能夠滿足各型別的需求

2) MP 的程式碼生成器  和 Mybatis MBG 程式碼生成器:

MP 的程式碼生成器都是基於 java 程式碼來生成。

MBG 基於 xml 檔案進行程式碼生成

MyBatis 的程式碼生成器可生成: 實體類、Mapper 介面、Mapper 對映檔案

MP 的程式碼生成器可生成: 實體類(可以選擇是否支援 AR)、Mapper 介面、Mapper 對映檔案、 Service 層、Controller 層.   3) 表及欄位命名策略選擇 在 MP 中,我們建議資料庫表名 和 表字段名採用駝峰命名方式, 如果採用下劃 線命名方式 請開啟全域性下劃線開關,如果表名欄位名命名方式不一致請註解指定,我 們建議最好保持一致。   這麼做的原因是為了避免在對應實體類時產生的效能損耗,這樣欄位不用做對映就能直 接和實體類對應。當然如果專案裡不用考慮這點效能損耗,那麼你採用下滑線也是沒問 題的,只需要在生成程式碼時配置 dbColumnUnderline 屬性就可以.

5.2 程式碼生成器依賴

1) 模板引擎 MP 的程式碼生成器預設使用的是 Apache 的 Velocity 模板,當然也可以更換為別的模板 技術,例如 freemarker。此處不做過多的介紹。 需要加入 Apache Velocity 的依賴.

<dependency>       
    <groupId>org.apache.velocity</groupId>     
    <artifactId>velocity-engine-core</artifactId>     
    <version>2.0</version> 
</dependency>

5.3MP 程式碼生成器示例程式碼

@Test  
public void testGenerator() { 
    //全域性配置 
    GlobalConfig config = new GlobalConfig();  
    config.setActiveRecord(true)   //是否支援AR模式 
             .setAuthor("CrazyJA") //作者 
             .setOutputDir("D:\\workspace_my\\mp03\\src\\main\\java")//生成路徑
             .setFileOverride(true)//檔案覆蓋  
             .setServiceName("%sService")  //設定生成的service介面名 首字母是否為I
             .setIdType(IdType.AUTO); //主鍵策略 
        
     //資料來源配置   
    DataSourceConfig dsConfig = new DataSourceConfig();
    dsConfig.setDbType(DbType.MYSQL)     
             .setUrl("jdbc:mysql://localhost:3306/javaEE_0228")                                                               
             .setDriverName("com.mysql.jdbc.Driver")    
             .setUsername("root")     
             .setPassword("1234");    
     //策略配置   
    StrategyConfig  stConfig = new StrategyConfig(); 
    stConfig.setCapitalMode(true) // 全域性大寫命名     
             .setDbColumnUnderline(true)  //表名 欄位名 是否使用下滑線命名
             .setNaming(NamingStrategy.underline_to_camel) // 資料庫表對映到實體的命名策略 
             .setInclude("tbl_employee")  //生成的表 
             .setTablePrefix("tbl_"); // 表字首 
    //包名策略 
    PackageConfig pkConfig = new PackageConfig();   
    pkConfig.setParent("com.atguigu.mp") 
             .setController("controller")     
             .setEntity("beans")    
             .setService("service"); 

    AutoGenerator ag  = new AutoGenerator()
             .setGlobalConfig(config)          
             .setDataSource(dsConfig)          
             .setStrategy(stConfig)          
             .setPackageInfo(pkConfig);   
    ag.execute();  
}   

  

6.外掛擴充套件

6.1 Mybatis 外掛機制簡介

1) 外掛機制: Mybatis 通過外掛(Interceptor) 可以做到攔截四大物件相關方法的執行,根據需求,完 成相關資料的動態改變。 Executor StatementHandler ParameterHandler ResultSetHandler

2) 外掛原理 四大物件的每個物件在建立時,都會執行 interceptorChain.pluginAll(),會經過每個外掛物件的 plugin()方法,目的是為當前的四大物件建立代理。代理物件就可以攔截到四 大物件相關方法的執行,因為要執行四大物件的方法需要經過代理.

6.2 分頁外掛    

1) com.baomidou.mybatisplus.plugins.PaginationInterceptor

6.3 執行分析外掛

1) com.baomidou.mybatisplus.plugins.SqlExplainInterceptor

2) SQL 執行分析攔截器,只支援 MySQL5.6.3 以上版本

3) 該外掛的作用是分析 DELETE  UPDATE 語句,防止小白 或者惡意進行 DELETE  UPDATE 全表操作

4) 只建議在開發環境中使用,不建議在生產環境使用

5) 在外掛的底層 通過 SQL 語句分析命令:Explain 分析當前的 SQL 語句,根據結果集中的 Extra 列來斷定當前是否全表操作。  

6.4 效能分析外掛

1) com.baomidou.mybatisplus.plugins.PerformanceInterceptor

2) 效能分析攔截器,用於輸出每條 SQL 語句及其執行時間

3) SQL 效能執行分析,開發環境使用,超過指定時間,停止執行。有助於發現問題

6.5 樂觀鎖外掛

1) com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor

2) 如果想實現如下需求: 當要更新一條記錄的時候,希望這條記錄沒有被別人更新

3) 樂觀鎖的實現原理: 取出記錄時,獲取當前 version 2 更新時,帶上這個 version 2 執行更新時,setversion = yourVersion+1 where version = yourVersion  如果 version 不對,就更新失敗

4) @Version 用於註解實體欄位,必須要有。

7.自定義全域性操作

根據 MybatisPlus 的 AutoSqlInjector 可以自定義各種你想要的 sql ,注入到全域性中,相當於自 定義 Mybatisplus 自動注入的方法。  

  之前需要在 xml 中進行配置的 SQL 語句,現在通過擴充套件 AutoSqlInjector 在載入 mybatis 環境 時就注入。

7.1  AutoSqlInjector  

1) 在 Mapper 介面中定義相關的 CRUD 方法

2) 擴充套件 AutoSqlInjector   inject 方法,實現 Mapper 介面中方法要注入的 SQL

3) 在 MP 全域性策略中,配置 自定義注入器

7.2 自定義注入器的應用之 邏輯刪除

假刪除、邏輯刪除: 並不會真正的從資料庫中將資料刪除掉,而是將當前被刪除的這條資料 中的一個邏輯刪除欄位置為刪除狀態. tbl_user   logic_delete = 1   →  -1   1) com.baomidou.mybatisplus.mapper.LogicSqlInjector

2) logicDeleteValue   邏輯刪除全域性值

3) logicNotDeleteValue  邏輯未刪除全域性值

4) 在 POJO 的邏輯刪除欄位 新增 @TableLogic 註解

5) 會在 mp 自帶查詢和更新方法的 sql 後面,追加『邏輯刪除欄位』 = 『LogicNotDeleteValue 預設值』

    刪除方法: deleteById()和其他 delete 方法,

    底層 SQL 呼叫的是 update tbl_xxx set 『邏輯刪除欄位』=『logicDeleteValue 預設值』

8.公共欄位自動填充

8.1 元資料處理器介面

com.baomidou.mybatisplus.mapper.MetaObjectHandler   insertFill(MetaObject metaObject)   

updateFill(MetaObject metaObject)   metaobject:  元物件.  是 Mybatis 提供的一個用於更加方便,更加優雅的訪問物件的屬性, 給物件的屬性設定值 的一個物件. 還會用於包裝物件.  支援對 Object 、Map、Collection 等物件進行包裝    本質上 metaObject 獲取物件的屬性值或者是給物件的屬性設定值,最終是要 通過 Reflector 獲取到屬性的對應方法的 Invoker, 最終 invoke.

8.2 開發步驟

1) 註解填充欄位  @TableFile(fill = FieldFill.INSERT)   檢視 FieldFill

2) 自定義公共欄位填充處理器  

3) MP 全域性注入  自定義公共欄位填充處理器

9. Idea 快速開發外掛

MybatisX 輔助 idea 快速開發外掛,為效率而生. 可以實現 java 與 xml 跳轉,根據 Mapper 介面中的方法自動生成 xml 結構.   官方安裝: File -> Settings -> Plugins -> Browse Repositories.. 輸入 mybatisx 安裝下載   Jar 安裝:  File -> Settings -> Plugins -> Install plugin from disk.. 選中 mybatisx..jar 安裝