
1.pom文件配置
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version>
</dependency>
<dependency>
温馨提示:
从上面的pom.xml配置可以看出,使用的mybatis版本为:3.5.3。不同的版本其实现自动生成代码的方式不同,特别是3.5.1及其以上的版本和之前的版本有很大区别。
这是官网中的说明:

2.工具类具体代码实现
package com.mycompany.common.utils;import com.au.sa.common.services.CommonAbstractService;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
public class MyBatisAutoGeneratorUtil {public static final String DB_URL = "jdbc:mysql://{ip}:{port}/{dbName}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=true&autoReconnect=true";public static final String DB_USER_NAME = "username";public static final String DB_PASSWORD = "*****";public static final String AUTHOR = "xiaohuihui";private static final String[] SUPPER_ENTITY_CONTAINS_FIELD = {"delete_flag", "version_num", "creation_date", "created_by", "last_update_date", "last_updated_by"};private static final String DEFAULT_OUT_PUT_DIR = "D://MyBatisPlusAutoGeneratorDir";private static final String RESP_OUT_PUT_DIR = "D://MyBatisPlusAutoGeneratorDir";private static final String DEFAULT_PARENT_PACK = "com.au.sa.storeRebate";private static final String BASE_SUPER_ENTITY_CLASS_NAME = "com.au.sa.storeRebate.common.entity.BaseDbEntity";private static final String[] TABLE_NAMES = new String[]{"table_name"};public static void main(String[] args) {FastAutoGenerator.create(DB_URL, DB_USER_NAME, DB_PASSWORD).globalConfig(builder -> {builder.author(AUTHOR) .enableSwagger() .outputDir(DEFAULT_OUT_PUT_DIR); }).packageConfig(builder -> {builder.parent("com.au.sa") .moduleName("storeRebate") .pathInfo(Collections.singletonMap(OutputFile.xml, DEFAULT_OUT_PUT_DIR)); }).strategyConfig(builder -> {builder.addInclude(TABLE_NAMES) .entityBuilder().enableTableFieldAnnotation().enableLombok().enableFileOverride().superClass(BASE_SUPER_ENTITY_CLASS_NAME).controllerBuilder().superClass(CommonAbstractService.class).enableHyphenStyle().enableRestStyle().enableFileOverride().formatFileName("%sController").serviceBuilder().enableFileOverride().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl").mapperBuilder().enableFileOverride().enableBaseResultMap().enableBaseColumnList().formatMapperFileName("%sDao");}).templateEngine(new FreemarkerTemplateEngine()) .execute();produceViewObject(false, TABLE_NAMES);}private static void produceViewObject(boolean isTablePrefix, String... tableNames) {for (int i = 0; i < tableNames.length; i++) {String tableName = tableNames[i];tableName = isTablePrefix ? tableName.substring(tableName.indexOf("_") + 1) : tableName;String outPutDir = RESP_OUT_PUT_DIR + "/" + (DEFAULT_PARENT_PACK.replace(".", "/")) + "/resp/";String baseFileName = underline2Camel(tableName, false);try {File outFile = new File(outPutDir);if (!outFile.exists()) {outFile.mkdirs();}File voFile = new File(outFile, baseFileName + "Resp.java");if (!voFile.exists()) {voFile.createNewFile();}BufferedReader reader = new BufferedReader(new FileReader(DEFAULT_OUT_PUT_DIR + "/" + (DEFAULT_PARENT_PACK.replace(".", "/")) + "/entity/"+ baseFileName + ".java"));FileWriter fw = new FileWriter(voFile);String line = null;String description = null;String regex = "([\u4e00-\u9fa5]+)";while ((line = reader.readLine()) != null) {Matcher matcher = Pattern.compile(regex).matcher(line); if (matcher.find()) {description = matcher.group(1);}int index = line.indexOf(baseFileName);if (line.contains("package")) {line = StringUtils.substringBeforeLast(line, ".") + ".resp;";} else if (index > -1 && !line.contains("@ApiModel")) {if (line.contains("+")) {line = StringUtils.substring(line, 0, index + baseFileName.length()) + "{\" +"; } else {line = StringUtils.substring(line, 0, index + baseFileName.length()) + "{";}line = line.replace(baseFileName, baseFileName + "Resp");} else if (line.contains("@TableName")) {description = "";continue;} else if (line.contains("@TableField") || line.contains("@TableId")) {boolean required = true;for (String col : SUPPER_ENTITY_CONTAINS_FIELD) {if (line.contains(col) && !StringUtils.equals("version_num", col)) {required = false;break;}}description = "";continue;} else if (line.contains("@Accessors") || line.contains("@Override") || line.contains("@TableLogic") || line.contains("@Version")) {continue;}line += "\r\n";fw.write(line);}fw.close();reader.close();} catch (Exception e) {log.error(e.getMessage(), e);}}}public static String underline2Camel(String line, boolean... smallCamel) {if (StringUtils.isBlank(line)) {return "";}StringBuffer sb = new StringBuffer();Pattern pattern = Pattern.compile("([A-Za-z\\d]+)(_)?");Matcher matcher = pattern.matcher(line);while (matcher.find()) {String word = matcher.group();if ((smallCamel.length == 0 || smallCamel[0]) && matcher.start() == 0) {sb.append(Character.toLowerCase(word.charAt(0)));} else {sb.append(Character.toUpperCase(word.charAt(0)));}int index = word.lastIndexOf('_');if (index > 0) {sb.append(word.substring(1, index).toLowerCase());} else {sb.append(word.substring(1).toLowerCase());}}return sb.toString();}
}
3.相关配置说明
参考官网:MyBatis-Plus代码生成器配置
属性 | 说明 | 示例 |
---|
url | jdbc 路径 | jdbc:mysql://127.0.0.1:3306/mybatis-plus |
username | 数据库账号 | root |
password | 数据库密码 | 123456 |
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").build();
方法 | 说明 | 示例 |
---|
dbQuery(IDbQuery) | 数据库查询 | new MySqlQuery(),只在SQLQuery下生效 |
schema(String) | 数据库 schema(部分数据库适用) | mybatis-plus |
typeConvert(ITypeConvert) | 数据库类型转换器 | new MySqlTypeConvert(),只在SQLQuery下生效 |
keyWordsHandler(IKeyWordsHandler) | 数据库关键字处理器 | new MySqlKeyWordsHandler() |
typeConvertHandler(ITypeConvertHandler) | 类型转换器(默认) | 自定义实现ITypeConvertHandler,只在DefaultQuery下生效 |
databaseQueryClass(AbstractDatabaseQuery) | 数据库查询方式 | 默认DefaultQuery.class(通用元数据), SQLQuery.class(SQL查询) |
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()).databaseQueryClass(SQLQuery.class).build();
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").schema("mybatis-plus").keyWordsHandler(new MySqlKeyWordsHandler()).build();
方法 | 说明 | 示例 |
---|
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();
方法 | 说明 | 示例 |
---|
parent(String) | 父包名 | 默认值:com.baomidou |
moduleName(String) | 父包模块名 | 默认值:无 |
entity(String) | Entity 包名 | 默认值:entity |
service(String) | Service 包名 | 默认值:service |
serviceImpl(String) | Service Impl 包名 | 默认值:service.impl |
mapper(String) | Mapper 包名 | 默认值:mapper |
xml(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").xml("mapper.xml").controller("controller").other("other").pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")).build();
方法 | 说明 | 示例 |
---|
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();
方法 | 说明 | 示例 |
---|
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”) 方法 formatNameFunction 可以格式化文件,参考测试用例 H2CodeGeneratorTest.testCustomFileByList |
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();
方法 | 说明 | 示例 |
---|
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 只能配置一项 ,支持正则匹配、例如 ^t_.* 所有 t_ 开头的表名 |
addExclude(String…) | 增加表排除匹配(内存过滤) | include 与 exclude 只能配置一项 ,支持正则匹配、例如 .*st$ 所有 st 结尾的表名 |
addTablePrefix(String…) | 增加过滤表前缀 | |
addTableSuffix(String…) | 增加过滤表后缀 | |
addFieldPrefix(String…) | 增加过滤字段前缀 | |
addFieldSuffix(String…) | 增加过滤字段后缀 | |
outputFile | 内置模板输出文件处理 | 参考测试用例 H2CodeGeneratorTest.testOutputFile |
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();
方法 | 说明 | 示例 |
---|
nameConvert(INameConvert) | 名称转换实现 | |
superClass(Class<?>) | 设置父类 | BaseEntity.class |
superClass(String) | 设置父类 | com.baomidou.global.BaseEntity |
disableSerialVersionUID | 禁用生成 serialVersionUID | 默认值:true |
enableFileOverride | 覆盖已生成文件 | 默认值:false |
enableColumnConstant | 开启生成字段常量 | 默认值:false |
enableChainModel | 开启链式模型 | 默认值:false |
enableLombok | 开启 lombok 模型 | 默认值:false |
enableRemoveIsPrefix | 开启 Boolean 类型字段移除 is 前缀 | 默认值:false |
enableTableFieldAnnotation | 开启生成实体时生成字段注解 | 默认值:false |
enableActiveRecord | 开启 ActiveRecord 模型 | 默认值:false |
versionColumnName(String) | 乐观锁字段名(数据库字段) | versionColumnName与versionPropertyName二选一即可 |
versionPropertyName(String) | 乐观锁属性名(实体) | versionColumnName与versionPropertyName二选一即可 |
logicDeleteColumnName(String) | 逻辑删除字段名(数据库字段) | logicDeleteColumnName与logicDeletePropertyName二选一即可 |
logicDeletePropertyName(String) | 逻辑删除属性名(实体) | logicDeleteColumnName与logicDeletePropertyName二选一即可 |
naming | 数据库表映射到实体的命名策略 | 默认下划线转驼峰命名:NamingStrategy.underline_to_camel |
columnNaming | 数据库表字段映射到实体的命名策略 | 默认为 null,未指定按照 naming 执行 |
addSuperEntityColumns(String…) | 添加父类公共字段 | |
addIgnoreColumns(String…) | 添加忽略字段 | |
addTableFills(IFill…) | 添加表字段填充 | |
addTableFills(List) | 添加表字段填充 | |
idType(IdType) | 全局主键类型 | |
convertFileName(ConverterFileName) | 转换文件名称 | |
formatFileName(String) | 格式化文件名称 | |
new StrategyConfig.Builder().entityBuilder().superClass(BaseEntity.class).disableSerialVersionUID().enableChainModel().enableLombok().enableRemoveIsPrefix().enableTableFieldAnnotation().enableActiveRecord().versionColumnName("version").logicDeleteColumnName("deleted").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();
方法 | 说明 | 示例 |
---|
superClass(Class<?>) | 设置父类 | BaseController.class |
superClass(String) | 设置父类 | com.baomidou.global.BaseController |
enableFileOverride | 覆盖已生成文件 | 默认值:false |
enableHyphenStyle | 开启驼峰转连字符 | 默认值:false |
enableRestStyle | 开启生成@RestController 控制器 | 默认值:false |
convertFileName(ConverterFileName) | 转换文件名称 | |
formatFileName(String) | 格式化文件名称 | |
new StrategyConfig.Builder().controllerBuilder().superClass(BaseController.class).enableHyphenStyle().enableRestStyle().formatFileName("%sAction").build();
方法 | 说明 | 示例 |
---|
superServiceClass(Class<?>) | 设置 service 接口父类 | BaseService.class |
superServiceClass(String) | 设置 service 接口父类 | com.baomidou.global.BaseService |
superServiceImplClass(Class<?>) | 设置 service 实现类父类 | BaseServiceImpl.class |
superServiceImplClass(String) | 设置 service 实现类父类 | com.baomidou.global.BaseServiceImpl |
enableFileOverride | 覆盖已生成文件 | 默认值:false |
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();
方法 | 说明 | 示例 |
---|
superClass(Class<?>) | 设置父类 | BaseMapper.class |
superClass(String) | 设置父类 | com.baomidou.global.BaseMapper |
enableFileOverride | 覆盖已生成文件 | 默认值:false |
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();
public final class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {@Overrideprotected void outputCustomFile(@NotNull Map<String, String> customFile, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {String entityName = tableInfo.getEntityName();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);});}
}
使用方式样例(其他细节参数请查看文档)
entityDTO.java.ftl 可参考源码内entity.java.ftl文件
FastAutoGenerator.create(url, username, password).globalConfig(builder -> {builder.author("abc") .enableSwagger() .fileOverride() .disableOpenDir() .outputDir(finalProjectPath + "/src/main/java"); }).packageConfig(builder -> {builder.parent("com.baomidou.mybatisplus.samples") .moduleName("test") .entity("model.entity") .other("model.dto") .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); }).injectionConfig(consumer -> {Map<String, String> customFile = new HashMap<>();customFile.put("DTO.java", "/templates/entityDTO.java.ftl");consumer.customFile(customFile);});