掌握StringTemplate的动态文本模版引擎:Java基础应用指南

简介

  StringTemplate是一个用于文本生成的模板引擎,它允许你将文本模板与数据合并以生成最终的文本输出。它通常用于生成文本文件、报告、代码和其他需要将数据插入模板的应用程序中。

官方文档:https://github.com/antlr/stringtemplate4/blob/master/doc/index.md

使用

1、Maven添加依赖

<dependency>
  <groupId>org.antlr</groupId>
  <artifactId>ST4</artifactId>
  <version>4.3.4</version>
  <scope>compile</scope>
</dependency>

2、快速开始

import org.stringtemplate.v4.*;
...
// 1。使用模板字符串创建一个StringTemplate实例
ST st = new ST("Hello, <name>!");
// 2.设置变量值:将要插入的数据绑定到模板变量上
st.add("name", "World");
// 3.使用render()方法渲染模板,将变量的值插入模板中
String output = hello.render();
System.out.println(output);

...

Hello, World

  重复使用模板:你可以多次使用同一模板实例,只需更改变量的值并再次调用render()方法。

这只是StringTemplate的基本用法。它还提供了更高级的功能,如条件语句、循环、嵌套模板等,以便更灵活地生成文本。你可以参考StringTemplate的文档或教程以深入了解其功能和用法。

3、模版组

  定义模板文件,命名为: sqlTemplate.stg, 其中文件格式如下:

// 模板定义看起来像带有无类型参数的函数定义:

templateName(arg1, arg2, ..., argN) ::= "single-line template"

或者

templateName(arg1, arg2, ..., argN) ::= <<
multi-line template
>>

或者

templateName(arg1, arg2, ..., argN) ::= <%
multi-line template that ignores indentation and newlines
%>

  要加载组文件,需要使用 STGroup 的 STGroupFile 子类:

// 加载文件名
STGroup stg = new STGroupFile("test.stg");

// 加载相对文件名
STGroup stg = new STGroupFile("templates/test.stg");

// load fully qualified file name
STGroup stg = new STGroupFile("/usr/local/share/templates/test.stg");

ST st = stg.getInstanceOf("templageName");

st.add("arg1", arg1);

String sql = st.render();

4、复杂写法示例

dynamicSql(defaultColumns, dynamicColumns, dynamicDimensions, viewTable)
::=<<
SELECT
<defaultColumns:{col|<col>}; separator=", ">
<if(dynamicColumns)>
    ,<dynamicColumns:{col|<col>}; separator=", ">
<endif>
FROM
<viewTable>
<if(dynamicDimensions)>
GROUP BY
    <dynamicDimensions:{dim|<dim>}; separator=", ">
<endif>
>>
public static void main(String[] args) {
        STGroup stg = new STGroupFile(SqlConstants.SQL_TEMPLATE);
        ST st = stg.getInstanceOf("dynamicSql");

        // 设置动态列和维度
        List<String> columns = Arrays.asList("column1", "column2", "column3");
        List<String> defaultColumns = Arrays.asList("dc", "dc2");
        List<String> dimensions = Arrays.asList("dimension1", "dimension2");

        st.add("defaultColumns", defaultColumns);
        st.add("dynamicColumns", columns);
        st.add("dynamicDimensions", dimensions);
        st.add("viewTable", "tableName");

        // 渲染模板并生成SQL查询语句
        String sqlQuery = st.render();
        System.out.println(sqlQuery);

    }

  ...

输出如下:

SELECT
dc, dc2
    ,column1, column2, column3
FROM
tableName
GROUP BY
    dimension1, dimension2

 

posted @ 2023-10-25 18:12  LUDAGOGO  阅读(3203)  评论(0)    收藏  举报