`
y806839048
  • 浏览: 1127106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

利用模板动态生成sql 模板示例

阅读更多

 

 

 

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模板自动生成dto、dao、rowmapper、bo、service代码

    总的来说,Java利用Freemarker模板生成代码是一种常见的自动化开发实践,它提高了开发效率,降低了出错概率,让开发者能更专注于业务逻辑的实现,而不是基础架构的搭建。通过理解和掌握这一技术,开发者可以更好地...

    hibernate实现动态SQL查询

    整个过程包括:加载模板文件、设置模型变量、解析模板生成SQL、执行SQL并返回结果。 七、示例代码 ```java // 创建Freemarker配置 Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....

    使用t4模板动态生成数据库表的插入脚本

    3. **构建插入语句**:遍历得到的列信息,使用C#拼接字符串生成SQL插入语句。在循环中,每条记录的插入语句都会被动态生成。例如: ```csharp string insertSql = "INSERT INTO [TableName] ("; foreach (var ...

    Java开发的sql生成器

    4. **配置文件**:可能包含数据库连接信息、SQL模板等配置。 5. **测试用例**:验证工具功能的JUnit或其他测试框架的测试用例。 在集成这个Java SQL生成器到你的项目中,你需要按照文档的指示配置数据库连接,然后...

    python 利用jinja2模板生成html代码实例

    在了解Python利用Jinja2模板生成HTML代码实例的知识点之前,首先要了解Jinja2是什么。Jinja2是一个流行的模板引擎,用于Python编程语言,广泛用于Web开发框架如Flask和Django中。其核心功能是将数据与模板结合生成...

    使用SQL查询 生成sql server数据库结构字典 生成html

    通过以上步骤,我们可以有效地利用SQL查询生成SQL Server数据库结构字典,并以美观的HTML格式展示出来。这种方式不仅提高了工作效率,还便于非技术人员理解和使用数据库结构信息。同时,根据实际需求调整查询脚本和...

    SpringBoot Velocity 代码生成模板

    在Spring Boot项目中,利用Velocity模板引擎,我们可以创建一系列模板文件,如Mapper、Mapper.xml、Service和Controller等,这些模板在运行时会根据数据库中的表结构动态生成对应的Java源码。这不仅避免了手动编写...

    PowerDesigner通过物理数据模型正向生成sql脚本并通过dbms创建表

    在"使用powerDesigner物理数据模型正向生成sql.xls"这个文件中,可能包含了如何使用PowerDesigner进行上述操作的具体步骤或者示例。通常,这类文件会指导用户如何打开PowerDesigner,创建或导入PDM,设置数据库连接...

    C# 动态模板生成静态页

    在.NET开发领域,C#是一...总的来说,C#动态模板生成静态页是提升网站性能和用户体验的有效手段,它涉及到数据获取、模板引擎、文件操作等多个方面。通过学习和理解这个主题,开发者可以更好地优化其ASP.NET应用程序。

    Excel VBA+SQL 数据管理与应用模板开发.rar

    - 压缩包中的"案例素材"可能包含实际的Excel模板、VBA代码示例和SQL查询,供学习者参考和实践。这些素材可以帮助理解如何将理论知识应用于实际问题中,提升技能。 通过理解和掌握这些知识点,你将能够开发出强大的...

    MyBatisPlus代码生成器自定义模板时的模板文件

    4. **模板示例**: - 在`Entity.java.ftl`中,你可以自定义字段的注解,如添加`@TableId`、`@TableField`等MyBatisPlus注解。 ```java ${column.javaType} ${column.columnName} ${column.isId eq '1'?'@TableId...

    SQL语名生成器

    9. **模板与自定义**:用户可以保存常用的SQL模板,方便日后重复使用,或者根据需要定制自己的SQL片段。 10. **代码自动完成**:提供代码补全功能,减少手动输入的工作量,提高编写SQL语句的速度。 通过使用SQL...

    Go-proto-go-sql为Protobufs生成SQL扫描器和评估器实现

    - `sql`目录:可能包含SQL模板文件,用于生成SQL查询。 - `gen`脚本:用于调用`protoc`编译器和插件,生成Go代码。 - `example`目录:可能包含示例代码,展示如何使用生成的代码与数据库交互。 总结来说,`proto-go...

    自动生成建表SQL !

    5. **预览和编辑**:生成SQL之前提供预览功能,并允许用户进行手动调整。 6. **版本控制**:与版本控制系统集成,便于跟踪和管理数据库结构的变化。 7. **数据迁移**:有些工具还提供了数据迁移功能,可以将已有数据...

    sql生成器--含注释

    此外,一些高级的SQL生成器可能还具备代码片段管理、模板化生成、导出SQL脚本和直接执行SQL的能力。 在压缩包中的"Release"文件,通常表示这是一个软件发布版本,可能包含了SQL生成器的安装程序、文档、示例或其他...

    hibernate增删改查和动态sql

    综上所述,这个压缩包文件可能包含了一个使用Hibernate和FreeMarker进行数据库操作的示例Web应用程序,具体包括了如何使用Hibernate进行基本的CRUD操作,并利用FreeMarker动态生成HQL来执行复杂的查询。通过学习和...

    SqlSugar生成实体类Demo

    本示例“SqlSugar生成实体类Demo”将重点介绍如何利用SqlSugar的T4模板生成实体类,以及进行基本的CRUD(创建、读取、更新、删除)操作。 首先,我们要理解什么是T4模板。T4是Visual Studio提供的一种文本模板技术...

    eclipse自动生成mybatis的sql与mapper的java项目

    【标签】"eclipse mybatis 自动生成sql 与实体类"进一步强调了使用Eclipse作为IDE,Mybatis作为持久层框架,以及该过程涉及的两个主要生成内容:SQL语句和实体类。Eclipse是Java开发的主流IDE,提供了丰富的插件支持...

    Finereport数据集参数实现动态列报表模板 + 函数JS代码

    总的来说,这个资源包提供了一个完整的解决方案,包括了FineReport的报表模板、SQL动态生成逻辑以及JavaScript交互增强。对于希望提升报表功能和用户体验的开发者来说,这是一个非常有价值的参考实例。通过学习和...

    程序结合SQL语句结构,动态实现SQL多条件查询语句代码

    总之,动态生成SQL多条件查询语句是程序开发中的常见需求,通过理解和利用SQL语句结构,我们可以构建出高效、灵活的查询机制。在实际应用中,还需要结合具体数据库系统的特点,以及业务需求,进行适当的调整和优化。

Global site tag (gtag.js) - Google Analytics