Freemarker 代碼自動生成簡介 附帶 OpenAutoGeneration 自定義模板代碼生成工具

目錄

百度百科

應用場景 - 代碼自動生成

FreeMarker 的基本組成/原理

場景注意事項

常用的FreeMarker語法

代碼片段

OpenAutoGeneration 自定義模板代碼生成工具


百度百科

FreeMarker是一款模板引擎: 即一種基於模板和要改變的數據,並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。

FreeMarker是免費的,基於Apache許可證2.0版本發佈。其模板編寫爲FreeMarker Template Language(FTL),屬於簡單、專用的語言。需要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算,之後模板顯示已經準備好的數據。在模板中,主要用於如何展現數據,而在模板之外注意於要展示什麼數據。

 

應用場景 - 代碼自動生成

在開發過程中,擁有一套合適自己團隊使用、切合自身業務需求的代碼自動生成工具是最好不過的。上面有提到 FreeMarker 可以生成輸出源代碼,接下來我們就以代碼自動生成工具的開發爲主要場景來認識一下 FreeMarker (本文主要講解後端Java代碼的自動生成邏輯已經主要代碼;同理,大家可以搭建一整套流程的自動生成工具,如:JS、Css、Html等,從而實現建表後,一鍵生成代碼,簡單修改後實現通用業務邏輯)。

FreeMarker 的基本組成/原理

基本組成:

1、FreeMarker模板(FreeMarker Template Language 即.ftl 文件):主要用於編寫模板;

2、Java Objects:Java 模型,主要用於填充或改變模板中對應表達式的數據;

3、FreeMarker Jar:freemarker-2.3.19.jar FreeMarker核心依賴包。

 

 

場景注意事項

通常,隨着時間的推移,我們會對之前的代碼不斷的做修改(包含數據庫字段的新增)。這裏我們使用java三大特性中的 繼承 來解決這一問題。

我們將自動生成的代碼類作爲父類,在對應的有一個子類繼承它。這樣建立開發契約:哪些類不能人工修改(即這裏提到的父類),要做功能擴展的時候在子類進行擴展;同時,代碼自動生成的時候可以選擇只生成父類,這樣數據庫字段做了改動,對原有人工編寫的代碼也不會進行覆蓋。

 

常用的FreeMarker語法

  • ${name?cap_first}

cap_first 表示變量 name 的值首字母大寫。

 

  • ${name?uncap_first}

uncap_first 表示變量 name 的值首字母小寫。

 

  • 遍歷List & 判斷語法

<#list tableInfoList as item>

<#if item.extra == 'auto_increment'>

public String get${item.column_name?cap_first}() {

if (null == id) {

return "";

}

return ConvertTBKey.getKeyId(id);

}

<#else>

public ${item.data_type} get${item.column_name?cap_first}() {

return ${item.column_name};

}

</#if>

public void set${item.column_name?cap_first}(${item.data_type} ${item.column_name}){

this.${item.column_name} = ${item.column_name};

}

</#list>

 

  • item_has_next

判斷表示所遍歷的計劃item不是最後一個值:

<#list tableInfoList as item>t.${item.column_name}<#if item_has_next>,</#if></#list>

 

  • 特殊符號不轉譯標籤

<#noparse>$</#noparse> 表示在輸出文件是 $ 符號不轉譯,直接輸出,常用在頁面。

 

  • 內置變量

${.now} 當前時間

 

 

 

代碼片段

//獲取表信息

String sql = "select column_name,data_type,column_type,column_comment,extra,column_key from columns where table_name='" + tableName + "' and table_schema='" + dbName + "';";
// 設置模板對象

Configuration configuration = new Configuration();

configuration.setDefaultEncoding("utf-8");//解決freemarker模板讀取後出現亂碼的問題

//設置模板文件路徑 非.ftl 文件,精確到文件目錄

configuration.setDirectoryForTemplateLoading(new File(templateDir));



//用於模板中的數據填充

Map<String, Object> TEMP_DATA_MAP = new HashMap<String, Object>();

 

/**

*

* @param configuration 模板的配置對象

* @param fileName 輸出文件名

* @param template 輸出文件所用模板名稱

* @param sourceRoot 目標文件根目錄

* @param fileSuffix 文件後綴

*/

private void buildSource(Configuration configuration, String fileName, String template, String sourceRoot, String fileSuffix){

try {

    //創建文件目錄

    creatDirs(sourceRoot);

    File docFile = new File(sourceRoot + "\\" + fileName + fileSuffix);

    Writer docout = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(docFile),"UTF-8"));

    //輸出文件

    Template temp = configuration.getTemplate(template);

    temp.setEncoding("UTF-8");

    temp.process(TEMP_DATA_MAP, docout);

    docout.flush();

} catch (Exception e) {

    e.printStackTrace();

}

}

 

 

OpenAutoGeneration 自定義模板代碼生成工具

最後,獻上開源工具供學習使用;

OpenAutoGeneration 自定義模板代碼生成工具 :

https://gitee.com/heiyogl/OpenSource.OpenAutoGeneration

https://github.com/Heiyogl/OpenSource.OpenAutoGeneration

使用說明:

https://blog.csdn.net/heiyogl/article/details/104757797

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章