MybatisPlus最新代码生成器(3.5.1+)使用教程(2)——输出文件名详细解析
简介
MybatisPlus最新代码生成器(3.5.1+)使用教程(1)——输出路径详细解析
MybatisPlus最新代码生成器(3.5.1+)使用教程(2)——输出文件名详细解析
MybatisPlus最新代码生成器(3.5.1+)使用教程(3)——指定数据库表详细解析
MybatisPlus最新代码生成器(3.5.1+)使用教程(4)——文件模板解析
上一篇文章,我们已经了解代码生成器(新)输出文件的类型,及其输出路径的配置方法,这一篇,我们来继续了解输出文件名该如何修改?
首先,阅读官方的示例代码:
从示例代码的注释中,我们可以猜测到
- 文件名来自于数据库表名;
- 文件名的自定义可以通过修改 StrategyConfig 的参数来实现;
经过初步代码阅读和分析,我确定了这部分逻辑就在 com.baomidou.mybatisplus.generator.config.po.TableInfo 当中。
TableInfo源码解析
我查找了给 entityName 赋值的源码,发现都在 TableInfo 的 processTable() 方法中:
首先根据 表信息 生成 entityName,再由 entityName 转换成各类输出文件的名称。
entityName
@Override
public @NotNull String entityNameConvert(@NotNull TableInfo tableInfo) {
// capitalFirst 函数的作用就是“实体首字母大写”
// tableInfo.getName() 返回的是数据库的表名
// strategyConfig.entity().getNaming() 默认值是 underline_to_camel,即“下划线转驼峰命名”;还有一种选择就是“不做任何改变,原样输出”
return NamingStrategy.capitalFirst(processName(tableInfo.getName(), strategyConfig.entity().getNaming(), strategyConfig.getTablePrefix(), strategyConfig.getTableSuffix()));
}
对应的 客户端代码 配置如下:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> {
builder.entityBuilder().naming(NamingStrategy.underline_to_camel);
builder.addTablePrefix("t_", "c_") // 对应上一段源码的 strategyConfig.getTablePrefix(),作用是文件名将去掉指定的前缀
.addTableSuffix("_relation"); // 对应上一段源码的 strategyConfig.getTableSuffix(),作用是文件名将去掉指定的后缀
})
.execute();
我们设置的一个或者多个 tablePrefix 和 tableSuffix 有什么作用呢?还得看源码 processName 方法:
如果表名以用户设置的tablePrefix中任何一个为前缀,entityName命名时将不包含该前缀
如果表名以用户设置的tableSuffix中任何一个结尾,entityName命名时将不包含该后缀
以上,就是能够影响 entityName 命名的三个参数了,如果你对此还不满意,那就只能自定义了:
FastAutoGenerator.create("url", "username", "password")
// customNameConvert 继承 INameConvert(名称转换接口)的类的实例对象
.strategyConfig(builder -> builder.entityBuilder().nameConvert(customNameConvert))
.execute();
默认情况下,局部变量 entityName 就等于成员变量 entityName,当然,你也可以通过 builder.entityBuilder().convertFileName((entityName -> entityName));
进行自定义。
Mapper和Mapper.xml文件名
- 实体类接口名 mapperName={entityName}Mapper
- xml文件名 xmlName={entityName}Mapper
自定义配置代码如下:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> builder.mapperBuilder()
.convertMapperFileName((entityName -> entityName + "Dao"))
.convertXmlFileName(entityName -> entityName + "Mapper"))
.execute();
Service和ServiceImpl文件名
类似地,
- 服务接口名 serviceName=I{entityName}Service
- 服务接口实现类 serviceImplName={entityName}ServiceImpl
自定义配置代码如下:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> builder.serviceBuilder()
.convertServiceFileName((entityName -> entityName + "Service"))
.convertServiceImplFileName(entityName -> entityName + "ServiceImpl"))
.execute();
Controller文件名
类似地,控制器文件名/类名 controllerName={entityName}Controller
自定义配置代码如下:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> builder.controllerBuilder()
.convertFileName((entityName -> entityName + "Service"))
)
.execute();
结论
entityName 通常可以通过 addTablePrefix 和 addTableSuffix 过滤掉表前缀或者表后缀:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> {
builder.addTablePrefix("t_", "c_") // 对应上一段源码的 strategyConfig.getTablePrefix(),作用是文件名将去掉指定的前缀
.addTableSuffix("_relation"); // 对应上一段源码的 strategyConfig.getTableSuffix(),作用是文件名将去掉指定的后缀
})
.execute();
其他,由 entityName 衍生的文件名:
TableInfo成员变量 | 描述 | 默认命名规范 |
---|---|---|
name | 数据库表名 | |
mapperName | 实体类接口名 | {entityName}Mapper |
xmlName | Mapper.xml文件名 | {entityName}Mapper |
serviceName | 服务接口文件名 | I{entityName}Service |
serviceImplName | 服务接口实现类文件名 | {entityName}ServiceImpl |
controllerName | 控制器类文件名 | {entityName}Controller |