目錄
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