前言:本文末尾處附有自定義代碼生成器的源碼,感興趣的可以前往下載喉前。
零、本文綱要
一王财、代碼生成器快速入門
二卵迂、源碼使用快速入門
三、自定義代碼生成器starter
一绒净、代碼生成器快速入門
1. 基礎(chǔ)依賴
mybatis-plus
mybatis-plus-boot-starter
mybatis-plus-extension
mybatis-plus-core
mybatis-plus-annotation
mybatis-plus-generator
2. 測(cè)試代碼
注意將下面的:url、username挂疆、password以及注釋部分的內(nèi)容改為自己測(cè)試模塊的內(nèi)容改览。
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> {
builder.author("baomidou") // 設(shè)置作者
.enableSwagger() // 開啟 swagger 模式
.fileOverride() // 覆蓋已生成文件
.outputDir("D://"); // 指定輸出目錄
})
.packageConfig(builder -> {
builder.parent("com.baomidou.mybatisplus.samples.generator") // 設(shè)置父包名
.moduleName("system") // 設(shè)置父包模塊名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 設(shè)置mapperXml生成路徑
})
.strategyConfig(builder -> {
builder.addInclude("t_simple") // 設(shè)置需要生成的表名
.addTablePrefix("t_", "c_"); // 設(shè)置過濾表前綴
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默認(rèn)的是Velocity引擎模板
.execute();
- 測(cè)試
然后就報(bào)錯(cuò)了
Caused by:
官方提供的依賴除了未傳遞依賴 mp 包缤言,還缺失了很大一部分依賴宝当。所以,直接跟源碼來探下究竟胆萧。
MyBatis-Plus 代碼生成器(3.5.1+版本)GitHub網(wǎng)址庆揩。
二、源碼使用快速入門
1. 查看源碼結(jié)構(gòu)
下載好源碼后跌穗,映入眼簾的是 build.gradle
订晌,可以看到官方是使用 gradle 來進(jìn)行依賴等內(nèi)容的統(tǒng)一管理的。
但是蚌吸,我們通常使用maven進(jìn)行項(xiàng)目開發(fā)锈拨,所以需要對(duì)管理工具做下簡(jiǎn)單調(diào)整。
我們需要通過查看 build.gradle
文件的 buildscript.dependencies
以及 ext.lib
的內(nèi)容羹唠,來插入官方使用版本的依賴奕枢。
或者使用IDEA工具自動(dòng)識(shí)別,add maven dependencies
肉迫。
2. 調(diào)整后的依賴
以下為IDEA工具添加的本地倉庫的依賴验辞,與以上不完全一致,如下:
<properties>
<mybatis.plus.generator.version>3.5.2</mybatis.plus.generator.version>
<mybatis.plus.annotation.version>3.4.3</mybatis.plus.annotation.version>
<mybatis.plus.core.version>3.4.3</mybatis.plus.core.version>
<mybatis.plus.extension.version>3.4.3</mybatis.plus.extension.version>
<kotlin.runtime.version>1.0.7</kotlin.runtime.version>
<freemarker.version>2.3.31</freemarker.version>
<velocity.version>1.5</velocity.version>
<beetl.version>3.10.0.RELEASE</beetl.version>
<mysql.connector.java.version>8.0.29</mysql.connector.java.version>
<slf4j.simple.version>1.7.21</slf4j.simple.version>
</properties>
<dependencies>
<!-- mybatis-plus生成器依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis.plus.generator.version}</version>
</dependency>
<!-- mybatis-plus注解依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>${mybatis.plus.annotation.version}</version>
</dependency>
<!-- mybatis-plus核心依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>${mybatis.plus.core.version}</version>
</dependency>
<!-- mybatis-plus額外拓展 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>${mybatis.plus.extension.version}</version>
</dependency>
<!-- 補(bǔ)充注解 -->
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-runtime</artifactId>
<version>${kotlin.runtime.version}</version>
</dependency>
<!-- freemarker模板框架 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!-- velocity工具 -->
<dependency>
<groupId>velocity</groupId>
<artifactId>velocity</artifactId>
<version>${velocity.version}</version>
</dependency>
<!-- beetl工具 -->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>${beetl.version}</version>
</dependency>
<!-- mysql數(shù)據(jù)庫連接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.java.version}</version>
</dependency>
<!-- 日志依賴 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.simple.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
3. 測(cè)試代碼
此處如上喊衫,省略跌造。
至此,我們已經(jīng)可以使用代碼生成器來幫助我們生成日常所需的代碼了。但是壳贪,每次使用還需要各種配置依賴陵珍,寫固定的代碼邏輯并不是我們希望的。所以违施,我們考慮將此內(nèi)容抽成一個(gè)starter互纯,即拿即用。
三磕蒲、自定義代碼生成器starter
1. 明確生成器starter的目標(biāo)
a留潦、配置使用
b、省去邏輯代碼編輯
2. 參考spring-boot-starter
① 自動(dòng)裝配
首先辣往,添加 spring-boot-starter-web 依賴兔院,也可以直接用starter,這個(gè)更全一些站削。
我們知道spring-boot項(xiàng)目自動(dòng)裝配會(huì)讀取 src/main/resources/META-INF/spring.factories
文件坊萝,進(jìn)而加載內(nèi)部的內(nèi)容。所以许起,我們編輯自己的自動(dòng)裝配類十偶。如下:
Ⅰ 在上述目錄添加 spring.factories 文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.stone.autoconfig.MyBatisPlusGeneratorAutoConfiguration
Ⅱ 編寫 MyBatisPlusGeneratorAutoConfiguration 自動(dòng)配置類
public class MyBatisPlusGeneratorAutoConfiguration {
}
② yml配置加載
spring-boot項(xiàng)目常常會(huì)編寫application.yml配置文件,然后自動(dòng)裝配時(shí)會(huì)自動(dòng)讀取其內(nèi)容园细。因此我們使用@ConfigurationProperties注解惦积,來幫助我們讀取指定配置。
通過查閱MyBatis Plus-代碼生成器官方文檔猛频,不難發(fā)現(xiàn)我們?cè)谧龅暮诵膬?nèi)容起始就是配置:
a荣刑、 數(shù)據(jù)庫配置(DataSourceConfig);
b伦乔、 全局配置(GlobalConfig)厉亏;
c、 包配置(PackageConfig)烈和;
d爱只、 模板配置(TemplateConfig)【不常用】;
e招刹、 注入配置(InjectionConfig)【不常用】恬试;
f、 策略配置(StrategyConfig)疯暑。
官方樣例配置了其中5個(gè)训柴,abcdf。因此妇拯,我們配置較為常用的5個(gè)幻馁,以及其較可能用到的屬性洗鸵、方法等。
Ⅰ 定制 數(shù)據(jù)庫配置(DataSourceConfig)
編寫 CustomDataSourceConfigProperties 類仗嗦,此處抽取了經(jīng)常配置的 url膘滨、username、password 舉例稀拐,如下:
@Component
@ConfigurationProperties(prefix = "stone.datasource")
public class CustomDataSourceConfigProperties {
/**
* 驅(qū)動(dòng)連接的URL
*/
private String url = null;
/**
* 數(shù)據(jù)庫連接用戶名
*/
private String username = "root";
/**
* 數(shù)據(jù)庫連接密碼
*/
private String password = "root";
//此處省略get/set方法
}
當(dāng)然火邓,此處如果為了方便,可以使用 lombok 依賴/插件德撬。
編寫 CustomDataSourceConfig 類铲咨,如下:
@Component
public class CustomDataSourceConfig {
@Autowired
private CustomDataSourceConfigProperties customDataSourceConfigProperties;
@Bean
public DataSourceConfig dataSourceConfig() {
//1. 獲取數(shù)據(jù)庫配置的建造者對(duì)象
DataSourceConfig.Builder builder = new DataSourceConfig.Builder(
//1.1 設(shè)置數(shù)據(jù)庫URL
customDataSourceConfigProperties.getUrl(),
//1.2 設(shè)置用戶名
customDataSourceConfigProperties.getUsername(),
//1.3 設(shè)置登錄密碼
customDataSourceConfigProperties.getPassword()
);
//2. 返回?cái)?shù)據(jù)源配置對(duì)象
return builder.build();
}
}
Ⅱ 全局配置(GlobalConfig)
Ⅲ 包配置(PackageConfig)
Ⅳ 模板配置(TemplateConfig)【不常用】
Ⅴ 策略配置(StrategyConfig)
省略。
③ 編寫自定義代碼生成器工具類
編寫CustomGenerator蜓洪,如下:
public class CustomGenerator {
@Autowired
private GlobalConfig globalConfig;
@Autowired
private PackageConfig packageConfig;
@Autowired
private StrategyConfig strategyConfig;
@Autowired
private TemplateConfig templateConfig;
@Autowired
private DataSourceConfig dataSourceConfig;
public void generateCode() throws Exception {
//1. 生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfig);
//2. 配置全局屬性
autoGenerator.global(globalConfig);
//3. 配置包屬性
autoGenerator.packageInfo(packageConfig);
//4. 配置策略
autoGenerator.strategy(strategyConfig);
//5. 配置模板
autoGenerator.template(templateConfig);
//6. 開始生成Code
autoGenerator.execute();
}
}
④ 在自動(dòng)配置類引入各個(gè)組件bean
@Import({
CustomDataSourceConfig.class,
CustomGlobalConfig.class,
CustomPackageConfig.class,
CustomStrategyConfig.class,
CustomTemplateConfig.class,
CustomDataSourceConfigProperties.class,
CustomGlobalConfigProperties.class,
CustomPackageConfigProperties.class,
CustomStrategyConfigProperties.class,
CustomTemplateConfigProperties.class
})
public class MyBatisPlusGeneratorAutoConfiguration {
@Bean
public CustomGenerator customGenerator() {
return new CustomGenerator();
}
}
此時(shí)鸣驱,我們install一下我們的程序就可以在項(xiàng)目中使用自定義的starter生成代碼。如果無法正常在項(xiàng)目中被加載蝠咆,則手動(dòng)build。
添加依賴北滥,在項(xiàng)目中測(cè)試:
Ⅰ 添加依賴
<dependency>
<groupId>com.stone.mybatis</groupId>
<artifactId>stone-mybatis-plus-generator-starter-simple</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
Ⅱ 編寫application.yml配置文件
stone:
datasource: # 數(shù)據(jù)源配置
url: "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false"
username: root
password: root
global: # 全局配置
author: stone
enable-swagger: true
output-dir: D:\JavaStudy\Level2\custom-generator-demo\src\main\java
package: # 包配置
parent: com.stone
xml: mapper.xml
strategy: # 策略配置
table-prefix: t_
Ⅲ 生成所需文件
@RunWith(SpringRunner.class)
@SpringBootTest(classes = GeneratorApplication.class)
public class GeneratorTest {
//注入自定義的生成器對(duì)象
@Autowired
private CustomGenerator customGenerator;
//測(cè)試生成代碼
@Test
public void testGenerator() throws Exception {
customGenerator.generateCode();
}
}
⑤ 優(yōu)化
我們常用的yml配置會(huì)有選項(xiàng)提示的內(nèi)容刚操,我們可以使用 spring-boot-configuration-processor 幫助我們完成此功能。
添加該依賴再芋,然后執(zhí)行 mvn:clean → install菊霜。此時(shí),我們可以在項(xiàng)目的 target/classes/META-INF
目錄下看到一個(gè) spring-configuration-metadata.json
文件济赎。將該文件復(fù)制至 src/main/resources/META-INF
目錄下鉴逞。
打開該文件,拖動(dòng)到最下方司训,如下:
"hints": []
hints 提供默認(rèn)選項(xiàng)的內(nèi)容并未配置构捡,還是空的。添加自己認(rèn)為需要提醒的默認(rèn)配置選項(xiàng)壳猜,如下:
"hints": [
{
"name": "stone.global.disable-open-dir",
"values": [
{
"value": false,
"description": "【默認(rèn)】打開輸出目錄"
},
{
"value": true,
"description": "不打開輸出目錄"
}
]
}
]
注意:在我們添加完 spring-configuration-metadata.json 文件后勾徽,將 spring-boot-configuration-processor 依賴注釋掉。未注釋的話统扳,框架運(yùn)行時(shí)又會(huì)生成一個(gè)該文件喘帚,同樣的提示顯示兩條。
至此咒钟,我們就可以在我們想要使用的項(xiàng)目中使用自己的代碼生成器生成代碼了吹由。
感興趣的話也可以直接下載過去使用:stone-mybatis-plus-generator-starter-simple (github.com)。
四朱嘴、結(jié)尾
以上即為MyBatis Plus-代碼生成器的全部?jī)?nèi)容倾鲫,感謝閱讀。