`
datamachine
  • 浏览: 163979 次
社区版块
存档分类
最新评论

Java下拼接执行动态SQL语句

阅读更多

       在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题:

        http://bbs.csdn.net/topics/390876591

        http://bbs.csdn.net/topics/390981627

        https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_items_see_more-0-b-ttl

        http://bbs.csdn.net/topics/390073758

        http://bbs.csdn.net/topics/390611005

             

       拼接动态SQL的一般做法有

      1、使用动态语句

很多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句、MSSQL的EXEC和SP_EXECUTESQL、Mysql的预处理语句等。这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这种方式只适用于相对简单地动态查询,复杂的情况经常会采用下面的方式。

2、使用存储过程

对于复杂的情况,一般会在存储过程中来拼接动态SQL。使用存储过程完成相对灵活,但编码复杂度过高,有时运行效率较低。

3、使用其他(如JAVA)程序

       使用外部的其他高级语言(如JAVA)拼接后再交由数据库执行也是一种选择,其灵活性较高,但由于JAVA缺乏对集合计算的支持,完成这些准备工作并不轻松。

 

如果需要执行动态SQL的主控程序是JAVA的,那么可以使用集算器来协助完成动态SQL类计算,集算器是动态解释执行的脚本,可以方便地拼出动态SQL执行。集算器提供了JDBC接口,可以置于Java应用程序与数据库之间,让应用程序继续象访问数据库一样执行集算器脚本,应用结构几乎不用改变。

下面通过例子来说明如何使用集算器完成动态SQL类计算,并集成进JAVA程序。

拼接动态SQL

       在集算器中完成动态SQL拼接,并将拼接后的SQL再交由数据库执行,以查询出目标结果。集算器在完成时并不涉及目标计算,只拼接动态SQL。如下面的需求:

 

参数source和target代表两个结构相同但数据不同的表,但表结构未知。要求以主键为标准用source更新target,比如table1和table2的主键都是A和B,数据如下:



 

       用table2更新table1时,MERGE语句应当如下:

       MERGE INTO table1 as t

       USING table2 as s

       ON t.A=s.A and t.B=s.B

       WHEN MATCHED

       THEN UPDATE SET t.C=s.C,t.D=s.D

       WHEN NOT MATCHED

       THEN INSERT VALUES(s.A,s.B,s.C,s.D)

 

 

        实现脚本:



 

        A1,A2: 从系统表中读出表source的主键存入变量pks,计算结果为集合["A","B"]。各种数据库获得主键的方法不同,这里以MSSQL为例。

 

        A3,A4:读出source的完整字段,columns的计算结果为["A","B","C","D"]。

 

        A5:动态生成MERGE语句。pks.(…)是循环函数,可对集合(包括结果集)的成员依次计算,计算中可用~引用循环变量,用#引用循环计数。

 

        A6:执行MERGE语句。

 

由于表结构未知,用存储过程或JAVA获得表结构再动态拼出SQL非常麻烦。使用集合类计算支持良好的集算器来做,代码简单,脚本通用,易于维护。

       集算脚本的计算结果可以作为报表数据源供报表使用,还可以在JAVA程序中通过JDBC的方式读取并使用,JAVA读取调用集算脚本代码如下:

           Class.forName("com.esproc.jdbc.InternalDriver");

                    con= DriverManager.getConnection("jdbc:esproc:local://");

                    //调用集算器脚本(类似存储过程),其中p1是集算脚本的文件名

                    st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call p1()");

st.setObject(1,"table1");

                    st.setObject(2," table2");

 

                        //执行脚本

                    st.execute();

                     ……

调用集算器脚本和访问数据库的方法完全一样,熟悉JDBC的程序员可以很快掌握。

关于集算器JDBC的部署和调用的更详细信息可参考集算器集成应用之被JAVA调用

动态表间连接

       相对静态的表间连接,动态表间连接事先并不知道要使用的表。如下面的数据查询:

       A表



 

        B表



 

        C表



 

        现需要根据A表的TableName获取B表或C表对应ID的Num值。

 

        目标结果:



 

        实现脚本:



 

        A1:执行SQL从A表取数;

        A2:先按TableName分组,循环分组拼接动态查询语句,最后把查询结果按照ID排序。

 

       通过集算器的集合计算能力(分组后仍然保存着分组成员供后续使用),让动态SQL的拼接工作简单化。

特殊格式数据更新

       除了动态数据查询,有时还需要进行动态更新,更新的数据经常来源于第三方程序,其格式也多种多样,如JSON格式、XML等。在特殊的业务背景下,有时需要将这些较特殊格式(相对传统的二维表来说)的数据更新到(关系)数据库中。这就需要借助第三方程序完成,而像JAVA等高级语言存在缺少类库、硬编码困难等问题。这时可以采用集算器来完成,下面来看一个集算器解析JSON格式文件入库的例子,源数据如下:



 

        要求:将上述内容中指定节点,主要是imei的Service列表更新到数据库2张表groups和Services中。

 

这里的JSON串由于包含多层且很多层都是动态的(如LIST和SERVICES下的节点数量和名称都不固定),这为解析带来了很大难度;而且其中属性名部分还包含空格(如MOVISTAR SPAIN)和点号(如Requires.Network)这也大大增加了解析难度,使用JAVA非常难写。

 

        实现脚本:



 

        A1:读入JSON格式文件,结果为带有层次的结果集;

 

        A2-A3:创建存储更新内容的两个空序表;

 

        A4-D10:循环A1,动态解析内容并将解析结果输出到A2、A3目标结果序表中;

 

        A11-A12:执行更新,将A2、A3序表更新到groups和services表中。

  • 大小: 22.9 KB
  • 大小: 93.3 KB
  • 大小: 5.3 KB
  • 大小: 4.4 KB
  • 大小: 4.4 KB
  • 大小: 4.1 KB
  • 大小: 23.3 KB
  • 大小: 83.9 KB
  • 大小: 113.9 KB
4
1
分享到:
评论

相关推荐

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    Java 使用注解拼接SQL语句

    "Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得更为简洁和可维护。这种技术通常与ORM(对象关系映射)框架如MyBatis或Hibernate结合使用,但也可以通过自定义处理逻辑实现。 1. **自定义...

    SQL语句拼接工具,简化SQL语句拼写代码

    随着数据库应用的日益复杂,编写和管理SQL语句变得越来越繁琐,尤其是在处理动态查询时,需要根据用户输入或业务条件拼接SQL字符串。为了解决这个问题,出现了SQL语句拼接工具,如描述中提到的,它能帮助简化SQL语句...

    开发sql语句拼接自动格式化工具

    SQL语句格式化工具是一种非常实用的开发辅助软件,它主要解决了在编写和维护大量SQL代码时遇到的格式混乱和拼接困难的问题。通过这款工具,开发者可以快速地将大段的SQL语句进行自动格式化,使得代码更加清晰、易读...

    如何获得PreparedStatement最终执行的sql语句

    这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有帮助。 在Java中,`PreparedStatement`对象通常会接收参数占位符(如`?`),然后在执行前填充具体...

    kettel循环执行动态sql

    标题中的“Kettle循环执行动态SQL”指的是使用Pentaho Data Integration(Kettle)工具来设计数据集成工作流,其中包含动态生成并执行SQL语句的步骤。在数据处理和ETL(Extract, Transform, Load)过程中,动态SQL是...

    SQL语句拼接

    尽管使用`StringBuffer`拼接SQL语句是一种简单有效的方法,但它也存在一些潜在的安全隐患,尤其是在处理用户输入时。例如,如果用户提交恶意输入,可能会导致SQL注入攻击。为了避免这种情况的发生,建议采用以下措施...

    MyBatis动态拼接SQL

    在某些场景下,我们可能需要根据业务逻辑动态地拼接SQL语句,以实现更复杂的查询需求。这就是MyBatis动态SQL的功能所在。 动态SQL是MyBatis的一大特色,它使得我们能够在运行时根据条件构建SQL语句。MyBatis通过`...

    SQL2JAVA-java字段串代码拼接小工具

    标题中的“SQL2JAVA-java字段串代码拼接小工具”是指一个辅助开发的软件,它主要功能是帮助程序员便捷地在Java代码和SQL语句之间进行转换,特别是处理字符串拼接的问题。在软件开发过程中,尤其是在数据库交互时,...

    sql语句中用问号代替参数

    2. **提高性能**:预编译的SQL语句可以在数据库中缓存,多次执行相同结构但不同参数的查询时,可以显著提高执行效率。数据库只需解析一次SQL模板,然后用新参数替换问号即可。 3. **减少错误**:动态构建SQL字符串...

    SqlUtils工具类,Sql IN 条件拼接工具类

    `SqlUtils`工具类是Java开发中用于处理SQL语句拼接的一个实用工具,特别是针对包含`IN`条件的查询。在数据库操作中,`IN`关键字常用于筛选满足特定集合条件的记录。例如,假设我们需要查找ID在一组值中的用户,我们...

    JDBC的动态SQL语句在浏览器_服务器模式中的应用.pdf

    动态SQL语句是指可以在运行时根据需要生成的SQL语句,而不是固定的SQL语句。这种技术可以提高应用程序的灵活性和可维护性。 在本文中,我们将讨论JDBC的动态SQL语句在浏览器/服务器模式中的应用。我们将介绍如何...

    c# 反射获取传入对象的属性拼接sql语句实现增、删、改、查

    利用反射动态拼接sql。 daohelper属于DAL层,objectdata类属于BLL层,BLL层引用DAL层。映射数据的表继承objectdata类。例如,数据表book,根据字段与属性一一对应的方式创建book类,插入数据库时,直接book.save()

    SQL拼接替换程序

    程序可以替换Java开发中SQL语句中参数的替换拼接,便于在数据库中执行Java开发中SQL语句。直接将参数替换SQL中的问号。将Java中写好的SQL拿出来,直接将参数逗号隔开依次写入,直接可替换生成可执行SQL语句。

    4-动态SQL语句编写.pdf

    这是一种常用的动态SQL实现方式,可以避免在拼接SQL语句时产生不合法的SQL。 #### 2. trim标签 trim标签用于处理SQL语句中的多余字符,比如在where条件后自动添加"and"或"or"关键字,或者在set语句中自动去除末尾...

    页面传入多个条件——sql语句的拼接

    2. **根据条件拼接SQL语句**: - **bookID条件**: ```java if (bookID != 0) { sql = sql + " and bookID=" + bookID; } ``` 如果`bookID`不为空,则将其添加到SQL语句中。 - **bookName条件**: ```...

    前台拼接SQL语句

    在IT行业中,数据库操作是日常开发中的...综上所述,"前台拼接SQL语句"是一个重要的安全警示,开发者应始终确保SQL操作在服务器端安全且高效地执行。通过遵循最佳实践,我们可以降低安全风险,提高应用的稳定性和性能。

    mybatis-demo11-动态SQL语句.zip

    在MyBatis中,动态SQL是其强大特性之一,允许开发者根据特定条件动态构建SQL语句。在本项目"mybatis-demo11-动态SQL语句.zip"中,我们将深入探讨如何在XML配置文件中使用MyBatis的动态SQL功能。 1. **什么是动态SQL...

    SQL语句参数替换拼接工具.rar

    SQL拼接替换程序能够替换Java开发中SQL语句中参数,以便于在数据库中执行Java开发中SQL语句。直接将参数替换SQL中的问号。填写要替换的SQL语句及参数,能够生成SQL代码。需要Java中写好的SQL填写上,直接将参数逗号...

    Java如何使用Query动态拼接SQL详解

    在使用Query语言时,我们可以根据不同的条件和参数来动态地拼接SQL语句,从而实现灵活的数据查询和处理。 3. Query语言的优点 使用Query语言可以带来多种优点,例如: * 灵活的数据查询:Query语言可以根据不同的...

Global site tag (gtag.js) - Google Analytics