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)——文件模板解析

上一篇文章,我们已经了解代码生成器(新)输出文件的类型,及其输出路径的配置方法,这一篇,我们来继续了解输出文件名该如何修改?

首先,阅读官方的示例代码:

从示例代码的注释中,我们可以猜测到

  1. 文件名来自于数据库表名;
  2. 文件名的自定义可以通过修改 StrategyConfig 的参数来实现;

经过初步代码阅读和分析,我确定了这部分逻辑就在 com.baomidou.mybatisplus.generator.config.po.TableInfo 当中。

TableInfo源码解析

我查找了给 entityName 赋值的源码,发现都在 TableInfoprocessTable() 方法中:

首先根据 表信息 生成 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();

我们设置的一个或者多个 tablePrefixtableSuffix 有什么作用呢?还得看源码 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 通常可以通过 addTablePrefixaddTableSuffix 过滤掉表前缀或者表后缀:

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
posted @ 2022-04-08 17:14  极客子羽  阅读(2005)  评论(0编辑  收藏  举报