官方网站 https://www.stringtemplate.org/
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