1.說明
MyBatis-Plus在3.5.1版本之後,
改變了代碼生成器的用法,
由於對歷史版本的不兼容,
這次重新梳理一份新的用法。
3.5.1版本之前的代碼生成器請參考:
SpringBoot集成MyBatis-Plus代碼生成器
SpringBoot集成MyBatis-Plus代碼生成器(Dao)
2.Maven依賴
完整的pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yuwen.spring</groupId>
<artifactId>database</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>mybatis-plus-code-generater-v3.5.1</artifactId>
<description>MyBatis Plus代碼生成器使用Demo,3.5.1版本之後的生成方式</description>
<properties>
<spring-boot.version>2.3.1.RELEASE</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Mybatis-Plus start MyBatis-Plus代碼生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3</version>
</dependency>
<!-- Mybatis-Plus end -->
<!-- Log4j2 start 日誌框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- Log4j2 end -->
</dependencies>
</project>
3.快速生成代碼
完整的CodeGenerator如下:
package com.yuwen.spring.uitl.generate;
import java.util.Collections;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
/**
*
* 代碼生成器 ,先修改下面的常量配置參數,然後執行 main方法
*/
public class CodeGenerator {
// 數據庫連接配置
private static final String JDBC_URL = "jdbc:mysql://11.12.13.14:3306/demodb?useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String JDBC_USER_NAME = "demo";
private static final String JDBC_PASSOWRD = "demo123456";
// 包名和模塊名
private static final String PACKAGE_NAME = "com.example";
private static final String MODULE_NAME = "demo";
// 表名,多個表使用英文逗號分割
private static final String[] TBL_NAMES = { "tbl_user", "tbl_role" };
// 表名的前綴,從表生成代碼時會去掉前綴
private static final String TABLE_PREFIX = "tbl_";
// 生成代碼入口main方法
public static void main(String[] args) {
// 1.數據庫配置
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(JDBC_URL, JDBC_USER_NAME,
JDBC_PASSOWRD).dbQuery(new MySqlQuery()).typeConvert(new MySqlTypeConvert())
.keyWordsHandler(new MySqlKeyWordsHandler());
// 1.1.快速生成器
FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder);
// 2.全局配置
// 覆蓋已生成文件
// 不打開生成文件目錄
// 指定輸出目錄,注意使用反斜槓\
// 設置註釋的作者
// 設置註釋的日期格式
// 使用java8新的時間類型
fastAutoGenerator.globalConfig(globalConfigBuilder -> globalConfigBuilder.fileOverride().disableOpenDir()
.outputDir("src\\main\\java").author("yuwen").commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK));
// 3.包配置
// 設置父包名
// 設置父包模塊名
// 設置MVC下各個模塊的包名
// 設置XML資源文件的目錄
fastAutoGenerator.packageConfig(packageConfigBuilder -> packageConfigBuilder.parent(PACKAGE_NAME)
.moduleName(MODULE_NAME).entity("entity").mapper("dao").service("service").serviceImpl("service.impl")
.controller("controller").other("other")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "src\\main\\resources\\mapper")));
// 4.模板配置
// 使用Freemarker引擎模板,默認的是Velocity引擎模板
AbstractTemplateEngine templateEngine = new FreemarkerTemplateEngine();
fastAutoGenerator.templateEngine(templateEngine);
// 5.注入配置 TODO
// 6.策略配置
// 設置需要生成的表名
// 設置過濾表前綴
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode()
.enableSkipView().disableSqlFilter().addInclude(TBL_NAMES).addTablePrefix(TABLE_PREFIX));
// 6.1.Entity策略配置
// 生成實體時生成字段的註解,包括@TableId註解等
// 數據庫表和字段映射到實體的命名策略,爲下劃線轉駝峯
// 全局主鍵類型爲None
// 實體名稱格式化爲XXXEntity
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.entityBuilder()
.enableTableFieldAnnotation().naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel).idType(IdType.NONE).formatFileName("%sEntity"));
// 6.2.Controller策略配置
// 開啓生成@RestController控制器
fastAutoGenerator
.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle());
// 6.3.Service策略配置
// 格式化service接口和實現類的文件名稱,去掉默認的ServiceName前面的I
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder()
.formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl"));
// 6.4.Mapper策略配置
// 格式化 mapper文件名,格式化xml實現類文件名稱
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder()
.formatMapperFileName("%sDao").formatXmlFileName("%sDao"));
// 7.生成代碼
fastAutoGenerator.execute();
}
}
4.生成的代碼
通過連接MySQL數據庫,
生成對應的代碼框架如下:
5.配置說明
5.1.數據庫配置(DataSourceConfig)
5.1.1.基礎配置
new DataSourceConfig.
Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").build();
5.1.2.可選配置
方法 |
說明 |
示例 |
dbQuery(IDbQuery) |
數據庫查詢 |
new MySqlQuery() |
schema(String) |
數據庫schema(部分數據庫適用) |
mybatis-plus |
typeConvert(ITypeConvert) |
數據庫類型轉換器 |
new MySqlTypeConvert() |
keyWordsHandler(IKeyWordsHandler) |
數據庫關鍵字處理器 |
new MySqlKeyWordsHandler() |
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
.dbQuery(new MySqlQuery())
.schema("mybatis-plus")
.typeConvert(new MySqlTypeConvert())
.keyWordsHandler(new MySqlKeyWordsHandler())
.build();
5.2.全局配置(GlobalConfig)
方法 |
說明 |
示例 |
fileOverride |
覆蓋已生成文件 |
默認值:false |
disableOpenDir |
禁止打開輸出目錄 |
默認值:true |
outputDir(String) |
指定輸出目錄 |
/opt/baomidou/ 默認值: windows:D:// linux or mac : /tmp |
author(String) |
作者名 |
baomidou 默認值:作者 |
enableKotlin |
開啓 kotlin 模式 |
默認值:false |
enableSwagger |
開啓 swagger 模式 |
默認值:false |
dateType(DateType) |
時間策略 |
DateType.ONLY_DATE 默認值: DateType.TIME_PACK |
commentDate(String) |
註釋日期 |
默認值: yyyy-MM-dd |
new GlobalConfig.Builder()
.fileOverride()
.outputDir("/opt/baomidou")
.author("baomidou")
.enableKotlin()
.enableSwagger()
.dateType(DateType.TIME_PACK)
.commentDate("yyyy-MM-dd")
.build();
5.3.包配置(PackageConfig)
方法 |
說明 |
示例 |
parent(String) |
父包名 |
默認值:com.baomidou |
moduleName(String) |
父包模塊名 |
默認值:無 |
entity(String) |
Entity 包名 |
默認值:entity |
service(String) |
Service 包名 |
默認值:service |
serviceImpl(String) |
Service Impl 包名 |
默認值:service.impl |
mapper(String) |
Mapper 包名 |
默認值:mapper |
mapperXml(String) |
Mapper XML 包名 |
默認值:mapper.xml |
controller(String) |
Controller 包名 |
默認值:controller |
other(String) |
自定義文件包名 |
輸出自定義文件時所用到的包名 |
pathInfo(Map<OutputFile, String>) |
路徑配置信息 |
Collections.singletonMap(OutputFile.mapperXml, "D://") |
new PackageConfig.Builder()
.parent("com.baomidou.mybatisplus.samples.generator")
.moduleName("sys")
.entity("po")
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.mapperXml("mapper.xml")
.controller("controller")
.other("other")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")
.build();
5.4.模板配置(TemplateConfig)
方法 |
說明 |
示例 |
disable |
禁用所有模板 |
|
disable(TemplateType...) |
禁用模板 |
TemplateType.ENTITY |
entity(String) |
設置實體模板路徑(JAVA) |
/templates/entity.java |
entityKt(String) |
設置實體模板路徑(kotlin) |
/templates/entity.java |
service(String) |
設置 service 模板路徑 |
/templates/service.java |
serviceImpl(String) |
設置 serviceImpl 模板路徑 |
/templates/serviceImpl.java |
mapper(String) |
設置 mapper 模板路徑 |
/templates/mapper.java |
mapperXml(String) |
設置 mapperXml 模板路徑 |
/templates/mapper.xml |
controller(String) |
設置 controller 模板路徑 |
/templates/controller.java |
new TemplateConfig.Builder()
.disable(TemplateType.ENTITY)
.entity("/templates/entity.java")
.service("/templates/service.java")
.serviceImpl("/templates/serviceImpl.java")
.mapper("/templates/mapper.java")
.mapperXml("/templates/mapper.xml")
.controller("/templates/controller.java")
.build();
5.5.注入配置(InjectionConfig)
方法 |
說明 |
示例 |
beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>) |
輸出文件之前消費者 |
|
customMap(Map<String, Object>) |
自定義配置 Map 對象 |
Collections.singletonMap("test", "baomidou") |
customFile(Map<String, String>) |
自定義配置模板文件 |
Collections.singletonMap("test.txt", "/templates/test.vm") |
new InjectionConfig.Builder()
.beforeOutputFile((tableInfo, objectMap) -> {
System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
})
.customMap(Collections.singletonMap("test", "baomidou"))
.customFile(Collections.singletonMap("test.txt", "/templates/test.vm"))
.build();
5.6.策略配置(StrategyConfig)
方法 |
說明 |
示例 |
enableCapitalMode |
開啓大寫命名 |
默認值:false |
enableSkipView |
開啓跳過視圖 |
默認值:false |
disableSqlFilter |
禁用 sql 過濾 |
默認值:true,語法不能支持使用 sql 過濾表的話,可以考慮關閉此開關 |
enableSchema |
啓用 schema |
默認值:false,多 schema 場景的時候打開 |
likeTable(LikeTable) |
模糊表匹配(sql 過濾) |
likeTable 與 notLikeTable 只能配置一項 |
notLikeTable(LikeTable) |
模糊表排除(sql 過濾) |
likeTable 與 notLikeTable 只能配置一項 |
addInclude(String...) |
增加表匹配(內存過濾) |
include 與 exclude 只能配置一項 |
addExclude(String...) |
增加表排除匹配(內存過濾) |
include 與 exclude 只能配置一項 |
addTablePrefix(String...) |
增加過濾表前綴 |
|
addTableSuffix(String...) |
增加過濾表後綴 |
|
addFieldPrefix(String...) |
增加過濾字段前綴 |
|
addFieldSuffix(String...) |
增加過濾字段後綴 |
|
entityBuilder |
實體策略配置 |
|
controllerBuilder |
controller 策略配置 |
|
mapperBuilder |
mapper 策略配置 |
|
serviceBuilder |
service 策略配置 |
|
new StrategyConfig.Builder()
.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.likeTable(new LikeTable("USER"))
.addInclude("t_simple")
.addTablePrefix("t_", "c_")
.addFieldSuffix("_flag")
.build();
5.6.1.Entity策略配置
方法 |
說明 |
示例 |
nameConvert(INameConvert) |
名稱轉換實現 |
|
superClass(Class<?>) |
設置父類 |
BaseEntity.class |
superClass(String) |
設置父類 |
com.baomidou.global.BaseEntity |
disableSerialVersionUID |
禁用生成 serialVersionUID |
默認值:true |
enableColumnConstant |
開啓生成字段常量 |
默認值:false |
enableChainModel |
開啓鏈式模型 |
默認值:false |
enableLombok |
開啓 lombok 模型 |
默認值:false |
enableRemoveIsPrefix |
開啓 Boolean 類型字段移除 is 前綴 |
默認值:false |
enableTableFieldAnnotationEnable |
開啓生成實體時生成字段註解 |
默認值:false |
enableActiveRecord |
開啓 ActiveRecord 模型 |
默認值:false |
versionColumnName(String) |
樂觀鎖字段名(數據庫) |
|
versionPropertyName(String) |
樂觀鎖屬性名(實體) |
|
logicDeleteColumnName(String) |
邏輯刪除字段名(數據庫) |
|
logicDeletePropertyName(String) |
邏輯刪除屬性名(實體) |
|
naming |
數據庫表映射到實體的命名策略 |
默認下劃線轉駝峯命名:NamingStrategy.underline_to_camel |
columnNaming |
數據庫表字段映射到實體的命名策略 |
默認爲 null,未指定按照 naming 執行 |
addSuperEntityColumns(String...) |
添加父類公共字段 |
|
addIgnoreColumns(String...) |
添加忽略字段 |
|
addTableFills(IFill...) |
添加表字段填充 |
|
addTableFills(List<IFill>) |
添加表字段填充 |
|
idType(IdType) |
全局主鍵類型 |
|
convertFileName(ConverterFileName) |
轉換文件名稱 |
|
formatFileName(String) |
格式化文件名稱 |
|
new StrategyConfig.Builder()
.entityBuilder()
.superClass(BaseEntity.class)
.disableSerialVersionUID()
.enableChainModel()
.enableLombok()
.enableRemoveIsPrefix()
.enableTableFieldAnnotation()
.enableActiveRecord()
.versionColumnName("version")
.versionPropertyName("version")
.logicDeleteColumnName("deleted")
.logicDeletePropertyName("deleteFlag")
.naming(NamingStrategy.no_change)
.columnNaming(NamingStrategy.underline_to_camel)
.addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time")
.addIgnoreColumns("age")
.addTableFills(new Column("create_time", FieldFill.INSERT))
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
.idType(IdType.AUTO)
.formatFileName("%sEntity")
.build();
5.6.2.Controller策略配置
方法 |
說明 |
示例 |
superClass(Class<?>) |
設置父類 |
BaseController.class |
superClass(String) |
設置父類 |
com.baomidou.global.BaseController |
enableHyphenStyle |
開啓駝峯轉連字符 |
默認值:false |
enableRestStyle |
開啓生成@RestController 控制器 |
默認值:false |
convertFileName(ConverterFileName) |
轉換文件名稱 |
|
formatFileName(String) |
格式化文件名稱 |
|
new StrategyConfig.Builder()
.controllerBuilder()
.superClass(BaseController.class)
.enableHyphenStyle()
.enableRestStyle()
.formatFileName("%sAction")
.build();
5.6.3.Service策略配置
方法 |
說明 |
示例 |
superServiceClass(Class<?>) |
設置 service 接口父類 |
BaseService.class |
superServiceClass(String) |
設置 service 接口父類 |
com.baomidou.global.BaseService |
superServiceImplClass(Class<?>) |
設置 service 實現類父類 |
BaseServiceImpl.class |
superServiceImplClass(String) |
設置 service 實現類父類 |
com.baomidou.global.BaseServiceImpl |
convertServiceFileName(ConverterFileName) |
轉換 service 接口文件名稱 |
|
convertServiceImplFileName(ConverterFileName) |
轉換 service 實現類文件名稱 |
|
formatServiceFileName(String) |
格式化 service 接口文件名稱 |
|
formatServiceImplFileName(String) |
格式化 service 實現類文件名稱 |
|
new StrategyConfig.Builder()
.serviceBuilder()
.superServiceClass(BaseService.class)
.superServiceImplClass(BaseServiceImpl.class)
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImp")
.build();
5.6.4.Mapper策略配置
方法 |
說明 |
示例 |
superClass(Class<?>) |
設置父類 |
BaseMapper.class |
superClass(String) |
設置父類 |
com.baomidou.global.BaseMapper |
enableMapperAnnotation |
開啓 @Mapper 註解 |
默認值:false |
enableBaseResultMap |
啓用 BaseResultMap 生成 |
默認值:false |
enableBaseColumnList |
啓用 BaseColumnList |
默認值:false |
cache(Class<? extends Cache>) |
設置緩存實現類 |
MyMapperCache.class |
convertMapperFileName(ConverterFileName) |
轉換 mapper 類文件名稱 |
|
convertXmlFileName(ConverterFileName) |
轉換 xml 文件名稱 |
|
formatMapperFileName(String) |
格式化 mapper 文件名稱 |
|
formatXmlFileName(String) |
格式化 xml 實現類文件名稱 |
|
new StrategyConfig.Builder()
.mapperBuilder()
.superClass(BaseMapper.class)
.enableMapperAnnotation()
.enableBaseResultMap()
.enableBaseColumnList()
.cache(MyMapperCache.class)
.formatMapperFileName("%sDao")
.formatXmlFileName("%sXml")
.build();
6.參考文章
MyBatis-Plus 代碼生成器(3.5.1+版本)