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 安裝