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