mybatis-plus自动代码生成器(新版本)
MyBatis-Plus 全新代码生成器在继承原有功能的基础上,引入了更加灵活和高效的 builder 模式,使得开发者能够快速生成符合需求的代码,同时保持代码的优雅和整洁。这个新特性旨在进一步提升开发效率,减少重复劳动,让开发者能够更加专注于业务逻辑的实现。
基本示例:
// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8", "root", "password")
.globalConfig(builder -> {
builder.author("Your Name") // 设置作者
.outputDir("src/main/java"); // 输出目录
})
.packageConfig(builder -> {
builder.parent("com.example") // 设置父包名
.entity("model") // 设置实体类包名
.mapper("dao") // 设置 Mapper 接口包名
.service("service") // 设置 Service 接口包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
.xml("mappers"); // 设置 Mapper XML 文件包名
})
.strategyConfig(builder -> {
builder.addInclude("table1", "table2") // 设置需要生成的表名
.entityBuilder()
.enableLombok() // 启用 Lombok
.enableTableFieldAnnotation() // 启用字段注解
.controllerBuilder()
.enableRestStyle(); // 启用 REST 风格
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎这块需要导入具体的模版库
.execute(); // 执行生成
集成
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
注意:全新的代码生成器添加于 3.5.1 版本,且对历史版本不兼容!
MyBatis-Plus Generator 支持如下模板引擎:
- VelocityTemplateEngine(Default)
- FreemarkerTemplateEngine
- BeetlTemplateEngine
- EnjoyTemplateEngine
由于代码生成器用到了模板引擎所以我们还需要导入模版引擎依赖
在mybatis-plus-generator-3.5.7.pom中可以看到以选择的模版引擎依赖,以下就是可选择的依赖:
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.16.1.RELEASE</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>5.1.3</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
配置
在自动代码生成器中配置由FastAutoGenerator完成主要有一下几个方面的配置
- DataSourceConfig:数据源配置
- GlobalConfig:全局配置
- PackageConfig:包配置
- StrategyConfig:策略配置
- InjectionConfig:注入配置
- AbstractTemplateEngine:模板引擎配置
又一下几个构造器创建对应的配置
/**
* 数据源配置 Builder
*/
private final DataSourceConfig.Builder dataSourceConfigBuilder;
/**
* 全局配置 Builder
*/
private final GlobalConfig.Builder globalConfigBuilder;
/**
* 包配置 Builder
*/
private final PackageConfig.Builder packageConfigBuilder;
/**
* 策略配置 Builder
*/
private final StrategyConfig.Builder strategyConfigBuilder;
/**
* 注入配置 Builder
*/
private final InjectionConfig.Builder injectionConfigBuilder;
/**
* 模板引擎
*/
private AbstractTemplateEngine templateEngine;
创建FastAutoGenerator
FastAutoGenerator中有两个静态函数用来创建 基础FastAutoGenerator
public static FastAutoGenerator create(@NotNull String url, String username, String password) {
return new FastAutoGenerator(new DataSourceConfig.Builder(url, username, password));
}
public static FastAutoGenerator create(@NotNull DataSourceConfig.Builder dataSourceConfigBuilder) {
return new FastAutoGenerator(dataSourceConfigBuilder);
}
可以看出FastAutoGenerator最基础的属性有三个分别是
- url:数据库连接路径
- username:数据库账户
- password:数据库密码
全局配置 GlobalConfig
方法 | 说明 |
---|---|
outputDir | 设置输出路径(可选,默认System.getProperty("os.name").toLowerCase().contains("windows") ? "D://" : "/tmp";) |
author | 设置作者(可选,默认:baomidou) |
enableKotlin | 开启后生成的代码为kotlin代码(可选,默认关闭) |
enableSwagger | 开启swagger模式,(可选,默认关闭)。注意:生成代码中有swagger中的类,所以项目需要依赖swagger |
enableSpringdoc | 开启Springdoc(可选,默认关闭)。注意:与swagger互斥 |
disableServiceInterface | 不生成service接口(可选,默认默认生成service接口) |
dateType | 时间类型对应策略(可选:默认DateType.TIME_PACK) |
commentDate(@NotNull Supplier<String> commentDate) | 注释日期获取处理(可选,默认 new SimpleDateFormat("yyyy-MM-dd").format(new Date())) |
commentDate(@NotNull String pattern) | 指定注释日期格式化(可选),与上一个commentDate函数只生效一个,最后一个生效 |
示例
FastAutoGenerator.create(properties.getProperty("jdbc.url"), properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password"))
//全局配置
.globalConfig(builder -> builder
.outputDir("/home/jelly/JavaProject/spring-data-demo/spring-boot-mybatis-plus/src/main/java")//设置输出路径(可选)
.author("Baomidou")//设置作者(可选,默认:baomidou)
.enableKotlin()//开启kotlin模式,开启后生成的代码为kotlin代码(可选,默认关闭)。注意:与 springdoc
.enableSwagger()//开启swagger模式,(可选,默认关闭)。注意:生成代码中有swagger中的类,所以项目需要依赖swagger
//.enableSpringdoc()//开启Springdoc(可选,默认关闭)。注意:与swagger互斥
.disableServiceInterface()//不生成service接口(可选,默认默认生成service接口)
.dateType(DateType.SQL_PACK)//时间类型对应策略(可选:默认DateType.TIME_PACK)
.commentDate(() -> {
"创建时间" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
})//注释日期获取处理(可选,默认 new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
.commentDate("yyyy-mm")//指定注释日期格式化(可选),与上一个commentDate函数只生效一个,最后一个生效
.build()//这个不调用也可以生效
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
数据库配置:DataSourceConfig
DataSourceConfig有三个基础配置
- url:数据库连接路径
- username:数据库账户
- password:数据库密码
一般来说在FastAutoGenerator.create函数中已经指定了可以不在设置这三个属性,如果再次设置这使用最后设置的配置。
可选配置
方法 | 用途 |
---|---|
dbQuery | 设置数据库查询实现 |
schema | schema(部分数据库适用) |
typeConvert | 数据库类型转换器 |
keyWordsHandler | 数据库类型转换器 |
databaseQueryClass | 数据库查询方式 。默认DefaultQuery.class(通用元数据) 1. DefaultQuery 默认查询方式,配合{@link #getTypeConvertHandler()} 使用 2. SQLQuery SQL语句查询方式,配合{@link #typeConvert} 使用 |
typeConvertHandler | 指定类型转换器 |
addConnectionProperty | 增加数据库连接属性 |
示例代码
DataSourceConfig dataSourceConfig = 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();
包配置 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 |
xml(String) | 指定类型转换器 |
controller(String) | 设置 Controller 包名,默认值: controller |
pathInfo(Map<OutputFile, String>) | 设置路径配置信息 |
StrategyConfig策略配置
方法 | 用途 |
---|---|
enableCapitalMode | 开启大写命名 默认值: false |
enableSkipView | 开启跳过视图 默认值: false |
disableSqlFilter | 禁用 SQL 过滤 默认值: true,如果 SQL 过滤不支持,可以关闭此选项 |
enableSchema | 启用 schema 默认值: false,多 schema 场景时启用 |
likeTable(LikeTable) | 模糊表匹配(SQL 过滤) 与 notLikeTable 互斥,只能配置一项 |
notLikeTable(LikeTable) | 模糊表排除(SQL 过滤) 与 likeTable 互斥,只能配置一项 |
addInclude(String…) | 增加表匹配(内存过滤) 与 addExclude 互斥,只能配置一项,支持正则匹配,如 ^t_.* 匹配所有以 t_ 开头的表名 |
addExclude(String…) | 增加表排除匹配(内存过滤) 与 addInclude 互斥,只能配置一项,支持正则匹配,如 .*st$ 匹配所有以 st 结尾的表名 |
addTablePrefix(String…) | 增加过滤表前缀 |
addTableSuffix(String…) | 增加过滤表后缀 |
addFieldPrefix(String…) | 增加过滤字段前缀 |
addFieldSuffix(String…) | 增加过滤字段后缀 |
outputFile | 内置模板输出文件处理 参考测试用例 H2CodeGeneratorTest.testOutputFile |
entityBuilder | 实体策略配置 |
controllerBuilder | Controller 策略配置 |
mapperBuilder | Mapper 策略配置 |
serviceBuilder | Service 策略配置 |
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.enableCapitalMode() // 开启大写命名
.enableSkipView() // 开启跳过视图
.disableSqlFilter() // 禁用 SQL 过滤
.likeTable(new LikeTable("USER")) // 模糊匹配表名
.addInclude("t_simple") // 增加表匹配
.addTablePrefix("t_", "c_") // 增加过滤表前缀
.addFieldSuffix("_flag") // 增加过滤字段后缀
.build();
Entity 策略配置
实体策略配置用于定制实体类的生成规则,包括父类、序列化版本 UID、文件覆盖、字段常量、链式模型、Lombok 模型等。
方法 | 说明 | 示例 |
---|---|---|
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<IFill>) | 添加表字段填充 | |
idType(IdType) | 全局主键类型 | |
convertFileName(ConverterFileName) | 转换文件名称 | |
formatFileName(String) | 格式化文件名称 |
StrategyConfig strategyConfig = 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) | 格式化文件名称 |
Controller 策略配置
Controller 策略配置用于定制 Controller 类的生成规则,包括父类、文件覆盖、驼峰转连字符、RestController 注解等。
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.controllerBuilder()
.superClass(BaseController.class)
.enableHyphenStyle()
.enableRestStyle()
.formatFileName("%sAction")
.build();
Service 策略配置
Service 策略配置用于定制 Service 接口和实现类的生成规则,包括父类、文件覆盖、文件名称转换等。
方法 | 说明 | 示例 |
---|---|---|
superServiceClass(Class<?>) | 接口父类 | 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 实现类文件名称 |
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.serviceBuilder()
.superServiceClass(BaseService.class)
.superServiceImplClass(BaseServiceImpl.class)
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImp")
.build();
Mapper 策略配置
Mapper 策略配置用于定制 Mapper 接口和对应的 XML 映射文件的生成规则,包括父类、文件覆盖、Mapper 注解、结果映射、列列表、缓存实现类等。
|方法|说明|示例|
|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 实现类文件名称||
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.mapperBuilder()
.superClass(BaseMapper.class)
.enableMapperAnnotation()
.enableBaseResultMap()
.enableBaseColumnList()
.cache(MyMapperCache.class)
.formatMapperFileName("%sDao")
.formatXmlFileName("%sXml")
.build();
InjectionConfig 注入配置
注入配置允许开发者自定义代码生成器的行为,包括在输出文件之前执行的逻辑、自定义配置 Map 对象、自定义配置模板文件等。
方法 | 说明 |
---|---|
beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>) | 输出文件之前执行的逻辑在生成文件之前执行自定义逻辑,如打印表信息或修改配置数据 |
customMap(Map<String, Object>) | 自定义配置 Map 对象用于在模板中访问自定义的配置信息,如项目名称、作者等 |
customFile(Map<String, String>) | 自定义配置模板文件用于指定自定义的模板文件路径,可以格式化文件名,参考测试用例 H2CodeGeneratorTest.testCustomFileByList |
InjectionConfig injectionConfig = new InjectionConfig.Builder()
.beforeOutputFile((tableInfo, objectMap) -> {
System.out.println("准备生成文件: " + tableInfo.getEntityName());
// 可以在这里添加自定义逻辑,如修改 objectMap 中的配置
})
.customMap(Collections.singletonMap("projectName", "MyBatis-Plus Generator"))
.customFile(Collections.singletonMap("custom.txt", "/templates/custom.vm"))
.build();
通过上述配置,开发者可以根据自己的需求,灵活地定制代码生成器的行为。例如,在生成文件之前执行特定的逻辑,或者使用自定义的模板文件来生成代码。这些配置选项提供了极大的灵活性,使得 MyBatis-Plus 代码生成器能够适应各种复杂的项目需求。
其他说明
DataSourceConfig.Builder.typeConvertHandler 说明
参数实现以下接口
public interface ITypeConvertHandler {
/**
* 转换字段类型
*
* @param globalConfig 全局配置
* @param typeRegistry 类型注册信息,可以用来获取当前列字段类型
* @param metaInfo 字段元数据信息,当前列字段信息
* @return 子类类型
*/
@NotNull
IColumnType convert(GlobalConfig globalConfig, TypeRegistry typeRegistry, TableField.MetaInfo metaInfo);
}
//可以对指定字,指定其他类型
评论区