MybatisPlus最新程式碼生成器(3.5.1+)使用教程(4)——檔案模板解析
簡介
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,放在你生成器客戶端程式碼的專案資源中: