簡介
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 |
