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

 

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