SpringBoot結合MyBatis Plus 自動生成代碼
本來這一章要介紹Redis+AOP優化權限,可是發現還是需要先介紹一些MyBatis Plus自動生成代碼
MyBatis Plus簡介
MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window)的增強工具,在 MyBatis 的基礎上只做增強不做改變,爲簡化開發、提高效率而生。
MyBatis Plus特性
- 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
- 損耗小:啓動即會自動注入基本 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支持數據庫
任何能使用 mybatis 進行 crud, 並且支持標準 sql 的數據庫
框架結構
MyBatis Plus代碼生成器
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發效率。
使用教程
添加 代碼生成器 依賴
<!--lombok依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--集成druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--Mysql數據庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
<!--MyBatis Plus 依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--MyBatis Plus 代碼生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!--Hutool Java工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.7</version>
</dependency>
<!--Velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!--Swagger-UI API文檔生產工具-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
添加 模板引擎 依賴
MyBatis-Plus 支持 Velocity(默認)、Freemarker、Beetl,用戶可以選擇自己熟悉的模板引擎,如果都不滿足您的要求,可以採用自定義模板引擎。本文使用默認依賴
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
編寫配置
MyBatis-Plus 的代碼生成器提供了大量的自定義參數供用戶選擇,能夠滿足絕大部分人的使用需求。
配置GlobalConfig
全局策略 globalConfig 配置
outputDir
- 生成文件的輸出目錄
- 默認值:D 盤根目錄
fileOverride - 是否覆蓋已有文件
- 默認值:false
open - 是否打開輸出目錄
- 默認值:true
enableCache - 是否在xml中添加二級緩存配置
- 默認值:false
author - 開發人員
- 默認值:null
kotlin - 開啓 Kotlin 模式
- 默認值:false
swagger2 - 開啓 swagger2 模式
- 默認值:false
activeRecord - 開啓 ActiveRecord 模式
- 默認值:false
baseResultMap - 開啓 BaseResultMap
- 默認值:false
baseColumnList - 開啓 baseColumnList
- 默認值:false
dateType - 時間類型對應策略
- 默認值:TIME_PACK
注意事項:
如下配置 %s 爲佔位符
entityName
- 實體命名方式
- 默認值:null 例如:%sEntity 生成 UserEntity
mapperName - mapper 命名方式
- 默認值:null 例如:%sDao 生成 UserDao
xmlName - Mapper xml 命名方式
- 默認值:null 例如:%sDao 生成 UserDao.xml
serviceName - service 命名方式
- 默認值:null 例如:%sBusiness 生成 UserBusiness
serviceImplName - service impl 命名方式
- 默認值:null 例如:%sBusinessImpl 生成 UserBusinessImpl
controllerName - controller 命名方式
- 默認值:null 例如:%sAction 生成 UserAction
idType - 指定生成的主鍵的ID類型
- 默認值:null
/**
* 全局配置
* @param projectPath
* @return
*/
public static GlobalConfig initGlobal(String projectPath){
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("zbb");
gc.setOpen(false);
gc.setSwagger2(true);
gc.setBaseResultMap(true);
gc.setFileOverride(true);
gc.setDateType(DateType.ONLY_DATE);
gc.setEntityName("%s");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setControllerName("%sController");
return gc;
}
配置 DataSourceConfig
dbQuery
- 數據庫信息查詢類
- 默認由 dbType 類型決定選擇對應數據庫內置實現實現 IDbQuery 接口自定義數據庫查詢 SQL 語句 定製化返回自己需要的內容
dbType - 數據庫類型
- 該類內置了常用的數據庫類型【必須】
schemaName - 數據庫 schema name
- 例如 PostgreSQL 可指定爲 publictypeConvert
- 類型轉換
- 默認由 dbType 類型決定選擇對應數據庫內置實現 實現 ITypeConvert 接口自定義數據庫 字段類型 轉換爲自己需要的 java 類型,內置轉換類型無法滿足可實現 IColumnType 接口自定義
url - 驅動連接的URLdriverName
- 驅動名稱username
- 數據庫連接用戶名password
- 數據庫連接密碼
/**
*
* 配置 DataSourceConfig
* @return
*/
public static DataSourceConfig initDataSource(){
Props props = new Props("application.properties");
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl(props.getStr("dataSource.url"));
dataSourceConfig.setDriverName(props.getStr("dataSource.driverName"));
dataSourceConfig.setUsername(props.getStr("dataSource.username"));
dataSourceConfig.setPassword(props.getStr("dataSource.password"));
return dataSourceConfig;
}
包配置包名配置
parent
- 父包名。如果爲空,將下面子包名必須寫全部, 否則就只需寫子包名
moduleName - 父包模塊名
entity - Entity包名
service - Service包名
serviceImpl - Service Impl包名
mapper - Mapper包名
xml - Mapper XML包名
controller - Controller包名
pathInfo - 路徑配置信息
/**
* 包配置
* @param packname
* @return
*/
public static PackageConfig initPackage(String packname){
Props props = new Props("application.properties");
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName(packname);
packageConfig.setParent(props.getStr("package.base"));
packageConfig.setEntity("model");
return packageConfig;
}
模板配置 TemplateConfig
entity
- Java 實體類模板
entityKt - Kotin 實體類模板
service - Service 類模板
serviceImpl - Service impl 實現類模板
mapper - mapper 模板
xml - mapper xml 模板
controller - controller 控制器模板
/**
* 模板配置
* @return
*/
public static TemplateConfig initTemplate() {
TemplateConfig templateConfig = new TemplateConfig();
//可以對controller、service、entity模板進行配置
templateConfig.setXml(null);
return templateConfig;
}
自定義屬性注入 InjectionConfig
map
- 自定義返回配置 Map 對象
- 該對象可以傳遞到模板引擎通過 cfg.xxx 引用
fileOutConfigList - 自定義輸出文件
- 配置 FileOutConfig 指定模板文件、輸出文件達到自定義文件生成目的
fileCreate - 自定義判斷是否創建文件
- 實現 IFileCreate 接口
該配置用於判斷某個類是否需要覆蓋創建,當然你可以自己實現差異算法 merge 文件
initMap
- 注入自定義 Map 對象(注意需要setMap放進去)
/**
* 自定義屬性注入
*/
public static InjectionConfig initInjection(String projectPath, String moduleName) {
// 自定義配置
InjectionConfig injectionConfig = new InjectionConfig() {
@Override
public void initMap() {
// 可用於自定義屬性
}
};
// 模板引擎是Velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定義輸出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定義配置會被優先輸出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸出文件名 , 如果你 Entity 設置了前後綴、此處注意 xml 的名稱會跟着發生變化!!
return projectPath + "/src/main/resources/mapper/" + moduleName
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
injectionConfig.setFileOutConfigList(focList);
return injectionConfig;
}
策略配置StrategyConfig
/**
* 策略配置
*/
public static StrategyConfig initStrategy(String[] tableNames) {
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
strategyConfig.setEntityLombokModel(true);
strategyConfig.setRestControllerStyle(true);
//當表名中帶*號時可以啓用通配符模式
if (tableNames.length == 1 && tableNames[0].contains("*")) {
String[] likeStr = tableNames[0].split("_");
String likePrefix = likeStr[0] + "_";
strategyConfig.setLikeTable(new LikeTable(likePrefix));
} else {
strategyConfig.setInclude(tableNames);
}
return strategyConfig;
}
代碼生成器
public static void main(String[] args) {
String projectPath = System.getProperty("user.dir");
String moduleName = scanner("模塊名");
String[] tableNames = scanner("表名,多個英文逗號分割").split(",");
// 代碼生成器
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setGlobalConfig(initGlobal(projectPath));
autoGenerator.setDataSource(initDataSource());
autoGenerator.setPackageInfo(initPackage(moduleName));
autoGenerator.setCfg(initInjection(projectPath, moduleName));
autoGenerator.setTemplate(initTemplate());
autoGenerator.setStrategy(initStrategy(tableNames));
autoGenerator.setTemplateEngine(new VelocityTemplateEngine());
autoGenerator.execute();
}
讀取控制檯內容
/**
* <p>
* 讀取控制檯內容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("請輸入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StrUtil.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("請輸入正確的" + tip + "!");
}
配置application.properties
dataSource.url=jdbc:mysql://db:3306/mymes?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
dataSource.driverName=com.mysql.jdbc.Driver
dataSource.username=reader
dataSource.password=123456
package.base=com.springboot.mymes_demo.modules
運行代碼
注:
在輸入表明的時候輸入xx_*表示xx前綴的所有表 若輸入全名,則生成對於的表
公衆號
公衆號https://mp.weixin.qq.com/s/nfat2WWWUXdmfUGFBAVEuA