SpringBoot整合StringTemplate模板引擎

官方网站 https://www.stringtemplate.org/

概述:记一次使用stringtemplate模板构建数据查询sql

1.先加入ST4依赖

<dependency>
	<groupId>org.antlr</groupId>
	<artifactId>ST4</artifactId>
	<version>4.0.8</version>
</dependency>

2.在resources目录下新建一个数据查询模板文件sqlTemplate.stg

querySql(limitFiled, groups, aggregators, filters, orders, table, notUseAs, useAliasForGroup)
::=<<
SELECT
<if(limitFiled)>
   <limitFiled.limitFiled>
<endif>
<if(!groups && !aggregators)>
    *
<endif>
<if(groups && notUseAs)>
    <groups:{group|<if(group)><group.fieldName> <endif>}; separator=",\n">
<endif>
<if(groups && !notUseAs)>
    <groups:{group|<if(group)><group.fieldName> AS <group.fieldAlias><endif>}; separator=",\n">
<endif>
    <if(groups && aggregators)>,<endif>
<if(aggregators)>
    <aggregators:{agg|<if(agg)><agg.fieldName> AS <agg.fieldAlias><endif>}; separator=",\n">
<endif>
FROM
    <table.tableName>   <table.tableAlias>
<if(filters)>
WHERE
    <filters:{filter|<if(filter)><filter><endif>}; separator="\nAND ">
<endif>
<if(groups && !useAliasForGroup)>
GROUP BY
    <groups:{group|<if(group)><group.fieldName><endif>}; separator=",\n">
<endif>
<if(groups && useAliasForGroup)>
GROUP BY
    <groups:{group|<if(group)><group.fieldAlias><endif>}; separator=",\n">
<endif>
<if(orders)>
ORDER BY
    <orders:{order|<if(order)><order.orderAlias> <order.orderDirection><endif>}; separator=",\n">
<endif>
>>

previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs, useAliasForGroup)
::=<<
SELECT
<if(limitFiled)>
   <limitFiled.limitFiled>
<endif>
<if(!groups && !aggregators)>
    *
<endif>
<if(groups && notUseAs)>
    <groups:{group|<if(group)><group.fieldName> <endif>}; separator=",\n">
<endif>
<if(groups && !notUseAs)>
    <groups:{group|<if(group)><group.fieldName> AS <group.fieldAlias><endif>}; separator=",\n">
<endif>
    <if(groups && aggregators)>,<endif>
<if(aggregators)>
    <aggregators:{agg|<if(agg)><agg.fieldName> AS <agg.fieldAlias><endif>}; separator=",\n">
<endif>
FROM
    <table.tableName>   <table.tableAlias>
<if(filters)>
WHERE
    <filters:{filter|<if(filter)><filter><endif>}; separator="\nAND ">
<endif>
<if(isGroup && groups && !useAliasForGroup)>
GROUP BY
    <groups:{group|<if(group)><group.fieldName><endif>}; separator=",\n">
<endif>
<if(isGroup && groups && useAliasForGroup)>
GROUP BY
    <groups:{group|<if(group)><group.fieldAlias><endif>}; separator=",\n">
<endif>
<if(orders)>
ORDER BY
    <orders:{order|<if(order)><order.orderAlias> <order.orderDirection><endif>}; separator=",\n">
<endif>
>>

3.创建模板类SQLObj

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SQLObj {
    private String tableName;
    private String tableAlias;
    private String fieldName;
    private String fieldAlias;
    private String groupField;
    private String groupAlias;
    private String orderField;
    private String orderAlias;
    private String orderDirection;
    private String whereField;
    private String whereAlias;
    private String whereTermAndValue;
    private String limitFiled;

    public static SQLObjBuilder builder() {
        return new SQLObjBuilder();
    }

    public static class SQLObjBuilder {
        private String tableName;
        private String tableAlias;
        private String fieldName;
        private String fieldAlias;
        private String groupField;
        private String groupAlias;
        private String orderField;
        private String orderAlias;
        private String orderDirection;
        private String whereField;
        private String whereAlias;
        private String whereTermAndValue;
        private String limitFiled;

        SQLObjBuilder() {
        }

        public SQLObjBuilder tableName(String tableName) {
            this.tableName = tableName;
            return this;
        }

        public SQLObjBuilder tableAlias(String tableAlias) {
            this.tableAlias = tableAlias;
            return this;
        }

        public SQLObjBuilder fieldName(String fieldName) {
            this.fieldName = fieldName;
            return this;
        }

        public SQLObjBuilder fieldAlias(String fieldAlias) {
            this.fieldAlias = fieldAlias;
            return this;
        }

        public SQLObjBuilder groupField(String groupField) {
            this.groupField = groupField;
            return this;
        }

        public SQLObjBuilder groupAlias(String groupAlias) {
            this.groupAlias = groupAlias;
            return this;
        }

        public SQLObjBuilder orderField(String orderField) {
            this.orderField = orderField;
            return this;
        }

        public SQLObjBuilder orderAlias(String orderAlias) {
            this.orderAlias = orderAlias;
            return this;
        }

        public SQLObjBuilder orderDirection(String orderDirection) {
            this.orderDirection = orderDirection;
            return this;
        }

        public SQLObjBuilder whereField(String whereField) {
            this.whereField = whereField;
            return this;
        }

        public SQLObjBuilder whereAlias(String whereAlias) {
            this.whereAlias = whereAlias;
            return this;
        }

        public SQLObjBuilder whereTermAndValue(String whereTermAndValue) {
            this.whereTermAndValue = whereTermAndValue;
            return this;
        }

        public SQLObjBuilder limitFiled(String limitFiled) {
            this.limitFiled = limitFiled;
            return this;
        }

        public SQLObj build() {
            return new SQLObj(this.tableName, this.tableAlias, this.fieldName, this.fieldAlias, this.groupField, this.groupAlias, this.orderField, this.orderAlias, this.orderDirection, this.whereField, this.whereAlias, this.whereTermAndValue, this.limitFiled);
        }

        public String toString() {
            return "SQLObj.SQLObjBuilder(tableName=" + this.tableName + ", tableAlias=" + this.tableAlias + ", fieldName=" + this.fieldName + ", fieldAlias=" + this.fieldAlias + ", groupField=" + this.groupField + ", groupAlias=" + this.groupAlias + ", orderField=" + this.orderField + ", orderAlias=" + this.orderAlias + ", orderDirection=" + this.orderDirection + ", whereField=" + this.whereField + ", whereAlias=" + this.whereAlias + ", whereTermAndValue=" + this.whereTermAndValue + ", limitFiled=" + this.limitFiled + ")";
        }
    }
}

4.根据数据构建模板

SQLObj tableObj = SQLObj.builder().tableName("t_user").tableAlias("t1").build();
List<SQLObj> xFields = new ArrayList<>();
xFields.add(SQLObj.builder().fieldName("id").fieldAlias("f_ax_1").build());
xFields.add(SQLObj.builder().fieldName("name").fieldAlias("f_ax_2").build());
xFields.add(SQLObj.builder().fieldName("age").fieldAlias("f_ax_3").build());

STGroup stg = new STGroupFile("sqlTemplate.stg");
ST st_sql = stg.getInstanceOf("previewSql");
st_sql.add("isGroup", false);
if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
String customWheres = "id > 10";
List<String> wheres = new ArrayList<>();
if (customWheres != null) wheres.add(customWheres);
if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
String render = st_sql.render();
System.out.println(render);

5.结果生成

SELECT
    id AS f_ax_1,
    name AS f_ax_2,
    age AS f_ax_3
FROM
    t_user   t1
WHERE
    id > 10
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值