MybatisPlus+mbg(代碼自動生成器)
簡介
非官方推出,而是别人開發出來的,對mybatis的加強工具(盡量不要和mybatis同時導入,避免沖突),侵入性小,自動注入了 CRUD,于jpa較為相似的。
特性
- 無侵入:隻做增強不做改變,引入它不會對現有工程産生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
- 強大的 CRUD 操作:内置通用 Mapper、通用 Service,僅僅通過少量配置即可實作單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支援 Lambda 形式調用:通過 Lambda 表達式,友善的編寫各類查詢條件,無需再擔心字段寫錯
- 支援主鍵自動生成:支援多達 4 種主鍵政策(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支援 ActiveRecord 模式:支援 ActiveRecord 形式調用,實體類隻需繼承 Model 類即可進行強大的 CRUD 操作
- 支援自定義全局通用操作:支援全局通用方法注入( Write once, use anywhere )
- 内置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支援模闆引擎,更有超多自定義配置等您來使用
- 内置分頁插件:基于 MyBatis 實體分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同于普通 List 查詢
- 分頁插件支援多種資料庫:支援 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種資料庫
- 内置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
- 内置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
日志配置
#日志輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
主鍵生成政策
public enum IdType {
/**
* 資料庫ID自增
*/
AUTO(0),
/**
* 該類型為未設定主鍵類型
*/
NONE(1),
/**
* 使用者輸入ID
* 該類型可以通過自己注冊自動填充插件進行填充
*/
INPUT(2),
/* 以下3種類型、隻有當插入對象ID 為空,才自動填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字元串全局唯一ID (idWorker 的字元串表示)
*/
ID_WORKER_STR(5);
private int key;
IdType(int key) {
this.key = key;
}
}
雪花算法
分布式Long 類型id生成算法(全球唯一,一般用來生成訂單号等….)
建立&更新時間
直接在資料庫聲明:
在代碼級别的聲明(需自定義處理器來處理):
@TableField(fill = FieldFill.INSERT) //使用該類注解是需要手動編寫處理器來處理
Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) //使用該類注解是需要手動編寫處理器來處理
Date updateTime;
樂觀鎖(CAS)
概念:每次不加鎖,假設沒有沖突而去完成某項操作;如果發生沖突了那就去重試,直到成功為止。
ABA問題
當一個線程去修改一個v為A的變量,将其修改為B後又修改回A,另一個線程将預期的V和後來的V對比相同,則CSA成功,但是v是被人修改過的
解決辦法:
為字段增加一個version字段,來儲存版本,每次修改時會修改該version
自編譯元件:
@Configuration
public class MyConfig {
@Bean
public OptimisticLockerInterceptor OptimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
分頁插件(自帶)
@Bean
public PaginationInterceptor PaginationInterceptor() {
return new PaginationInterceptor();
}
====================================================
//分頁工具測試
@Test
void testPageHelper() {
//分頁
Page<User> page = new Page<>(1,5);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
System.out.println("總頁數:"+page.getTotal());
}
邏輯删除(資源回收筒)
概念:不直接去删除,而是用一個變量的值來代表是否被删除
基本使用過程:
- 編寫元件
//邏輯删除 @Bean public ISqlInjector LogicSqlInjector() { return new LogicSqlInjector(); }
- 添加注解邏輯删除pojo屬性
@TableLogic private int deleted;//邏輯删除
- 配置檔案配置邏輯删除的值
#邏輯删除設定 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
性能分析插件
功能:可以通過限制一些sql的執行時間和格式化sql語句
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-uHeX3wNA-1626420484571)(C:\Users\liuguangcheng\AppData\Roaming\Typora\typora-user-images\image-20210616204321065.png)]
//性能分析插件
@Bean
@Profile("dev") //必須配置環境
public PerformanceInterceptor PerformanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setFormat(true);
performanceInterceptor.setMaxTime(5);
return performanceInterceptor;
}
條件構造器
作用:自動注入的CRUD隻能滿足小部分需求,大部分的複雜(單表)sql還是得通過條件構造器來編寫
建議:多表查詢需手動編寫sql和mapper檔案
用例:
//wrapper構造器
@Test
void testWrapper(){
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("name","lgc");
List list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
代碼生成器
依賴導入:
<!--代碼生成器的必要引擎-->
<!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
編寫一個main方法配置并執行删除器的代碼:
public class CodeGenerator {
public static void main(String[] args) {
// 1、建立代碼生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
//String projectPath = System.getProperty("user.dir");
gc.setOutputDir("D:\\Idea_workspace\\guli_parent\\service\\service-edu" + "/src/main/java");
gc.setAuthor("l");
gc.setOpen(false); //生成後是否打開資料總管
gc.setFileOverride(false); //重新生成時檔案是否覆寫
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.ID_WORKER_STR); //主鍵政策
gc.setDateType(DateType.ONLY_DATE);//定義生成的實體類中日期類型
gc.setSwagger2(true);//開啟Swagger2模式
mpg.setGlobalConfig(gc);
// 3、資料源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost/guli?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
//包:com.atguigu.eduservice
pc.setParent("com.lll");
pc.setModuleName("eduservice"); //子產品名
//包:com.atguigu.eduservice.controller
pc.setController("controller");
//包:com.atguigu.eduservice.entity
pc.setEntity("entity");
//包:com.atguigu.eduservice.service
pc.setService("service");
//包:com.atguigu.eduservice.mapper
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、政策配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("teacher");//對應資料庫表名
strategy.setNaming(NamingStrategy.underline_to_camel);//資料庫表映射到實體的命名政策
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成實體時去掉表字首
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//資料庫表字段映射到實體的命名政策
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鍊式操作
strategy.setRestControllerStyle(true); //restful api風格控制器
strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉連字元
mpg.setStrategy(strategy);
// 6、執行
mpg.execute();
}
}