1. 程式人生 > 其它 >MybatisPlus最新程式碼生成器(3.5.1+)使用教程(4)——檔案模板解析

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,放在你生成器客戶端程式碼的專案資源中: