Freemarker 的使用

Freemarker

freemarker 是一款开源的模版引擎,可以基于模版方便的生成结果。 https://freemarker.apache.org/

Freemarker 的使用

编写 ftl 模版

以生成 postgres 查询的 sql 语句为例 编写 delete.ftl 文件,${} 中的字段是参数

1
DROP TABLE IF EXISTS ${schema}.${name};

当然实际使用中的模版可能复杂的多,以部分创建表模版为例 我们可以在模版中使用 import 引入其它模版 使用 assign 设置变量 使用 if, list 等 使用 ?? 判断是否为空,使用 !false 如果为空,默认 false

<#import "../../macro/constraints.ftl" as CONSTRAINTS>
<#assign with_clause = false>
<#if fillfactor!false || parallel_workers!false || toast_tuple_target!false || (autovacuum_custom!false && add_vacuum_settings_in_sql!false) || autovacuum_enabled == 't' || autovacuum_enabled == 'f' || (toast_autovacuum!false && add_vacuum_settings_in_sql!false) || toast_autovacuum_enabled == 't' || toast_autovacuum_enabled == 'f' >
    <#assign with_clause = true>
</#if>
<#list columns as c >

其它模版使用可以参考 https://freemarker.apache.org/docs/dgui_template.html

java 使用 freemarker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class FreemarkerManager {
    
    private static final FreemarkerManager INSTANCE = new FreemarkerManager();
    
    private final Configuration templateConfig = createTemplateConfiguration();
    
    /**
     * Get freemarker manager instance.
     * 
     * @return freemarker manager instance
     */
    public static FreemarkerManager getInstance() {
        return INSTANCE;
    }
    
    @SneakyThrows
    private Configuration createTemplateConfiguration() {
        Configuration result = new Configuration(Configuration.VERSION_2_3_31);
        result.setDirectoryForTemplateLoading(new File(Objects.requireNonNull(FreemarkerManager.class.getClassLoader().getResource("template")).getFile()));
        result.setDefaultEncoding("UTF-8");
        return result;
    }
    
    /**
     * Get sql from template.
     * 
     * @param data data
     * @param path path
     * @return sql
     */
    @SneakyThrows
    public static String getSqlFromTemplate(final Map<String, Object> data, final String path) {
        Template template = FreemarkerManager.getInstance().templateConfig.getTemplate(path);
        try (StringWriter result = new StringWriter()) {
            template.process(data, result);
            return result.toString();
        }
    }
}
updatedupdated2024-05-132024-05-13