MybatisPlus 代码生成器、定制代码模板
相关的 pom 版本
<mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
<freemarker.version>2.3.31</freemarker.version>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
直接上代码
package com.quickboot;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* MybatisPlus 代码生成器
* https://baomidou.com/pages/981406/
*
* @author Tellsea
* @date 2022/11/22
*/
public class MybatisPlusGenerateTest {
public static void main(String[] args) {
// 参数
String author = "Tellsea";
String parentPackage = "com.quickboot";
String mavenModuleName = "quick-boot-generate";
String moduleName = "generate";
String tableName = "sys_dict";
FileUtil.del("D:\\Workspace\\IDEAWorkspace\\quick-boot\\quick-boot\\quick-boot-generate\\src\\main\\java\\com\\quickboot\\generate");
FileUtil.del("D:\\Workspace\\IDEAWorkspace\\quick-boot\\quick-boot\\quick-boot-generate\\src\\main\\resources\\mapper\\generate");
String rootPath = System.getProperty("user.dir") + "/" + mavenModuleName + "/src/main";
FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/quick-boot", "root", "123456")
.globalConfig(builder -> {
builder.outputDir(rootPath + "/java")
.author(author)
.enableSwagger()
.dateType(DateType.ONLY_DATE)
.commentDate("yyyy-MM-dd");
})
.packageConfig(builder -> {
builder.parent(parentPackage)
.moduleName(moduleName)
.pathInfo(Collections.singletonMap(OutputFile.xml, rootPath + "/resources/mapper/" + moduleName))
.other("vo");
})
.templateConfig(builder -> {
builder.entity("/templates/java/entity.java")
.service("/templates/java/service.java")
.serviceImpl("/templates/java/serviceImpl.java")
.mapper("/templates/java/mapper.java")
.xml("/templates/java/mapper.xml")
.controller("/templates/java/controller.java");
})
.strategyConfig(builder -> {
builder.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.addInclude(tableName)
// 实体类
.entityBuilder()
.disableSerialVersionUID()
.enableChainModel()
.enableLombok()
.naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
//.addSuperEntityColumns("created_by", "created_time", "updated_by", "updated_time", "delete_status")
.idType(IdType.AUTO);
builder.controllerBuilder().enableRestStyle();
})
.injectionConfig(builder -> {
Map<String, String> customFile = new HashMap<>(16);
customFile.put("Vo.java", "/templates/java/vo.java.ftl");
customFile.put(".sql", "/templates/sql/sql.ftl");
customFile.put(".vue", "/templates/vue/index.vue.ftl");
customFile.put(".js", "/templates/js/js.ftl");
builder.customFile(customFile);
})
.templateEngine(new EnhanceFreemarkerTemplateEngine())
.execute();
}
}
生成效果
- 代码生成器支持自定义[DTO\VO等]模版
package com.quickboot;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.util.Map;
/**
* 代码生成器支持自定义[DTO\VO等]模版
*
* @author Tellsea
* @date 2022/11/23
*/
public final class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {
@Override
protected void outputCustomFile(@NotNull Map<String, String> customFile, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
String entityName = tableInfo.getEntityName();
objectMap.put("entityVo", entityName + "Vo");
String otherPath = this.getPathInfo(OutputFile.other);
customFile.forEach((key, value) -> {
String fileName = String.format(otherPath + File.separator + entityName + "%s", key);
this.outputFile(new File(fileName), objectMap, value);
});
}
}
- 代码模板从 MybatisPlus 的代码生成器 jar 包复制出来修改即可