import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STGroupFile;
stringtemplate,可以用来通过实体类操作的方式转化sql---从而实现sql的页面拖拽配置拼接
1,准备ST可识别的模板
sqlTemplate.stg
2,配置常量模板文件位置
Constants
3,代码使用
BuriedPointsServiceImpl
private String getInsertSql(Class clz, Set<QueryColumn> headers){
String tableName = getTableName4Info(clz);
STGroup stg = new STGroupFile(Constants.SQL_TEMPLATE);
ST st = stg.getInstanceOf("insertData");
st.add("tableName", tableName);
st.add("columns", headers);
String sql = st.render();
return sql;
}
模板示例:
内置sql模板 ,从模板看filter中的字段都是and
groups--实体key对应的值
<groups:{group(遍历这个key的值)|<group>(取这个key的值)>
<if(!groups && !aggregators && !filters && !orders)>
<sql>
<else>
SELECT
<if(!groups && !aggregators)>
*
<endif>
<if(groups)>
<groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<if(groups && aggregators)>,<endif>
<if(aggregators)>
<if(nativeQuery)>
<aggregators:{agg|<if(agg)><if(keywordPrefix && keywordSuffix)><keywordPrefix><agg.column><keywordSuffix><else><agg.column><endif><endif>}; separator=",">
<else>
<aggregators:{agg|<if(agg)><agg><endif>}; separator=",">
<endif>
<endif>
FROM (<sql>) T
<if(filters)>
WHERE <filters:{filter|<if(filter)><filter><endif>}; separator=" AND ">
<endif>
<if(groups)>
<if(!nativeQuery)>
GROUP BY <groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<endif>
<if(orders)>
ORDER BY <orders:{order|<if(order)><order.column> <order.direction><endif>}; separator=", ">
<endif>
<endif>
ViewServiceImpl:
public void buildQuerySql(List<String> querySqlList, Source source, ViewExecuteParam executeParam) {
if (null != executeParam) {
//构造参数, 原有的被传入的替换
STGroup stg = new STGroupFile(Constants.SQL_TEMPLATE);
ST st = stg.getInstanceOf("querySql");
st.add("nativeQuery", executeParam.isNativeQuery());
st.add("groups", executeParam.getGroups());
if (executeParam.isNativeQuery()) {
st.add("aggregators", executeParam.getAggregators());
} else {
st.add("aggregators", executeParam.getAggregators(source.getJdbcUrl(), source.getDbVersion()));
}
st.add("orders", executeParam.getOrders(source.getJdbcUrl(), source.getDbVersion()));
st.add("filters", convertFilters(executeParam.getFilters(), source));
st.add("keywordPrefix", sqlUtils.getKeywordPrefix(source.getJdbcUrl(), source.getDbVersion()));
st.add("keywordSuffix", sqlUtils.getKeywordSuffix(source.getJdbcUrl(), source.getDbVersion()));
for (int i = 0; i < querySqlList.size(); i++) {
st.add("sql", querySqlList.get(i));
querySqlList.set(i, st.render());---------------------实体类型的sql,结合框架模板变成sql
}
}
}
解析结果:
SELECT
`update_time`
,
sum(`data_value`) AS 'sum(data_value)'
FROM (SElECT * FROM fact_mysteel_data LIMIT 1,20) T
WHERE `data_date` in ('2019-08-12','2019-08-09')
GROUP BY `update_time`
改造之后:
querySqlAndOr(nativeQuery, groups, aggregators, filters, orders, sql, keywordPrefix, keywordSuffix,filterAndFlag)
::=<<
<if(!groups && !aggregators && !filters && !orders)>
<sql>
<else>
SELECT
<if(!groups && !aggregators)>
*
<endif>
<if(groups)>
<groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<if(groups && aggregators)>,<endif>
<if(aggregators)>
<if(nativeQuery)>
<aggregators:{agg|<if(agg)><if(keywordPrefix && keywordSuffix)><keywordPrefix><agg.column><keywordSuffix><else><agg.column><endif><endif>}; separator=",">
<else>
<aggregators:{agg|<if(agg)><agg><endif>}; separator=",">
<endif>
<endif>
FROM (<sql>) T
<if(filters && filterAndFlag)>
WHERE <filters:{filter|<if(filter)><filter><endif>}; separator=" AND ">
<endif>
<if(filters && !filterAndFlag)>
WHERE <filters:{filter|<if(filter)><filter><endif>}; separator=" OR ">
<endif>
<if(groups)>
<if(!nativeQuery)>
GROUP BY <groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<endif>
<if(orders)>
ORDER BY <orders:{order|<if(order)><order.column> <order.direction><endif>}; separator=", ">
<endif>
<endif>
>>
相关推荐
总的来说,Java利用Freemarker模板生成代码是一种常见的自动化开发实践,它提高了开发效率,降低了出错概率,让开发者能更专注于业务逻辑的实现,而不是基础架构的搭建。通过理解和掌握这一技术,开发者可以更好地...
整个过程包括:加载模板文件、设置模型变量、解析模板生成SQL、执行SQL并返回结果。 七、示例代码 ```java // 创建Freemarker配置 Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....
3. **构建插入语句**:遍历得到的列信息,使用C#拼接字符串生成SQL插入语句。在循环中,每条记录的插入语句都会被动态生成。例如: ```csharp string insertSql = "INSERT INTO [TableName] ("; foreach (var ...
4. **配置文件**:可能包含数据库连接信息、SQL模板等配置。 5. **测试用例**:验证工具功能的JUnit或其他测试框架的测试用例。 在集成这个Java SQL生成器到你的项目中,你需要按照文档的指示配置数据库连接,然后...
在了解Python利用Jinja2模板生成HTML代码实例的知识点之前,首先要了解Jinja2是什么。Jinja2是一个流行的模板引擎,用于Python编程语言,广泛用于Web开发框架如Flask和Django中。其核心功能是将数据与模板结合生成...
通过以上步骤,我们可以有效地利用SQL查询生成SQL Server数据库结构字典,并以美观的HTML格式展示出来。这种方式不仅提高了工作效率,还便于非技术人员理解和使用数据库结构信息。同时,根据实际需求调整查询脚本和...
在Spring Boot项目中,利用Velocity模板引擎,我们可以创建一系列模板文件,如Mapper、Mapper.xml、Service和Controller等,这些模板在运行时会根据数据库中的表结构动态生成对应的Java源码。这不仅避免了手动编写...
在"使用powerDesigner物理数据模型正向生成sql.xls"这个文件中,可能包含了如何使用PowerDesigner进行上述操作的具体步骤或者示例。通常,这类文件会指导用户如何打开PowerDesigner,创建或导入PDM,设置数据库连接...
在.NET开发领域,C#是一...总的来说,C#动态模板生成静态页是提升网站性能和用户体验的有效手段,它涉及到数据获取、模板引擎、文件操作等多个方面。通过学习和理解这个主题,开发者可以更好地优化其ASP.NET应用程序。
- 压缩包中的"案例素材"可能包含实际的Excel模板、VBA代码示例和SQL查询,供学习者参考和实践。这些素材可以帮助理解如何将理论知识应用于实际问题中,提升技能。 通过理解和掌握这些知识点,你将能够开发出强大的...
4. **模板示例**: - 在`Entity.java.ftl`中,你可以自定义字段的注解,如添加`@TableId`、`@TableField`等MyBatisPlus注解。 ```java ${column.javaType} ${column.columnName} ${column.isId eq '1'?'@TableId...
9. **模板与自定义**:用户可以保存常用的SQL模板,方便日后重复使用,或者根据需要定制自己的SQL片段。 10. **代码自动完成**:提供代码补全功能,减少手动输入的工作量,提高编写SQL语句的速度。 通过使用SQL...
- `sql`目录:可能包含SQL模板文件,用于生成SQL查询。 - `gen`脚本:用于调用`protoc`编译器和插件,生成Go代码。 - `example`目录:可能包含示例代码,展示如何使用生成的代码与数据库交互。 总结来说,`proto-go...
5. **预览和编辑**:生成SQL之前提供预览功能,并允许用户进行手动调整。 6. **版本控制**:与版本控制系统集成,便于跟踪和管理数据库结构的变化。 7. **数据迁移**:有些工具还提供了数据迁移功能,可以将已有数据...
此外,一些高级的SQL生成器可能还具备代码片段管理、模板化生成、导出SQL脚本和直接执行SQL的能力。 在压缩包中的"Release"文件,通常表示这是一个软件发布版本,可能包含了SQL生成器的安装程序、文档、示例或其他...
综上所述,这个压缩包文件可能包含了一个使用Hibernate和FreeMarker进行数据库操作的示例Web应用程序,具体包括了如何使用Hibernate进行基本的CRUD操作,并利用FreeMarker动态生成HQL来执行复杂的查询。通过学习和...
本示例“SqlSugar生成实体类Demo”将重点介绍如何利用SqlSugar的T4模板生成实体类,以及进行基本的CRUD(创建、读取、更新、删除)操作。 首先,我们要理解什么是T4模板。T4是Visual Studio提供的一种文本模板技术...
【标签】"eclipse mybatis 自动生成sql 与实体类"进一步强调了使用Eclipse作为IDE,Mybatis作为持久层框架,以及该过程涉及的两个主要生成内容:SQL语句和实体类。Eclipse是Java开发的主流IDE,提供了丰富的插件支持...
总的来说,这个资源包提供了一个完整的解决方案,包括了FineReport的报表模板、SQL动态生成逻辑以及JavaScript交互增强。对于希望提升报表功能和用户体验的开发者来说,这是一个非常有价值的参考实例。通过学习和...
总之,动态生成SQL多条件查询语句是程序开发中的常见需求,通过理解和利用SQL语句结构,我们可以构建出高效、灵活的查询机制。在实际应用中,还需要结合具体数据库系统的特点,以及业务需求,进行适当的调整和优化。