簡介
MybatisPlus最新代碼生成器(3.5.1+)使用教程(1)——輸出路徑詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(2)——輸出文件名詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(3)——指定數據庫表詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(4)——文件模板解析
禁止輸出 Service 接口的方法
現在,比如有一個需求點,是6種默認輸出文件中,我不想要輸出 Service 接口,該怎么辦呢?
我們從 execute() 作為切入點開始追蹤代碼:
-> execute(), com.baomidou.mybatisplus.generator.FastAutoGenerator
-> batchOutput(), com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine
-> outputService(), com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine
以下是 outputService 的源碼:
第一種方式,是讓 servicePath 為空,即找不到輸出路徑:
FastAutoGenerator.create("url", "username", "password")
.packageConfig(builder -> builder.pathInfo(Collections.singletonMap(OutputFile.service, "")))
.execute();
第二種方式,如果 getTemplateFilePath 能夠返回空,即找不到模板文件:
FastAutoGenerator.create("url", "username", "password")
.templateConfig(builder -> builder.service(""))
.execute();
不過這種方式實際操作時,其實也會影響到 PathInfoHandler,導致不添加默認輸出路徑,而使得 servicePath 等於 null
第三種方式,讓 serviceName 為空,即找不到輸出文件名:
FastAutoGenerator.create("url", "username", "password")
.strategyConfig(builder -> builder.serviceBuilder().convertServiceFileName((entityName) -> ""))
.execute();
不過,這三種方式,在輸出得到 ServiceImpl 文件時,都會找不到對應的 Service 接口,接下來看看這個問題如何解決。
各模板文件的默認路徑
首先,我們要知道 TemplateConfig 的各個屬性的默認值:
成員變量 | 默認值 | 描述 |
---|---|---|
entity | /templates/entity.java |
實體模板路徑 |
entityKt | /templates/entity.kt |
實體模板路徑(kotlin模板) |
controller | /templates/controller.java |
控制器模板路徑 |
mapper | /templates/mapper.java |
Mapper模板路徑 |
xml | /templates/mapper.xml |
MapperXml模板路徑 |
service | /templates/service.java |
Service模板路徑 |
serviceImpl | /templates/serviceImpl.java |
ServiceImpl模板路徑 |
disableEntity | false | 是否禁用實體模板(默認 false) |
以 ServiceImpl 為例,執行 getTemplateFilePath 方法時:
最終返回值,視語言模板不同而不同:
模板引擎 | 追加后綴 | getTemplateFilePath默認返回值(以serviceImpl為例) |
---|---|---|
VelocityTemplateEngine | .vm | /templates/serviceImpl.java.vm |
FreemarkerTemplateEngine | .ftl | /templates/serviceImpl.java.ftl |
BeetlTemplateEngine | .btl | /templates/serviceImpl.java.btl |
我們可以從 mybatis-plus-generator.jar 的資源文件夾中看到以下默認模板:
修改 ServiceImpl 模板
因此,我們就可以對 ServiceImpl 模板進行一些修改,移除對 Service 的繼承:
package ${package.ServiceImpl};
import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;
/**
* <p>
* $!{table.comment} 服務實現類
* </p>
*
* @author ${author}
* @since ${date}
*/
@Service
#if(${kotlin})
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>() {
}
#else
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> {
}
#end
並且把這個文件命名為 serviceImpl.java.vm,放在你生成器客戶端代碼的項目資源中: