`

可以从PreparedStatement中提取Sql的类LoggableStatement

    博客分类:
  • Java
阅读更多
本人只是根据原类稍作修改...
实现原理:
重新实现PreparedStatement接口.定义两个辅助变量:sqlTemplate和parameterValues
sqlTemplate带有?的Sql,parameterValues存放参数值,是一个ArrayList.然后在每个set方法中调用saveQueryParamValue
方法设置parameterValues列表...
替换?为参数值的方法:
java 代码
  1. public String getQueryString() {   
  2.   
  3.         StringBuffer buf = new StringBuffer();   
  4.         int qMarkCount = 0;   
  5.         StringTokenizer tok = new StringTokenizer(sqlTemplate+" ""?");   
  6.         while (tok.hasMoreTokens()) {   
  7.             String oneChunk = tok.nextToken();   
  8.             buf.append(oneChunk);   
  9.   
  10.             try {   
  11.                 Object value;   
  12.                 if (parameterValues.size() > 1 + qMarkCount) {   
  13.                     value = parameterValues.get(1 + qMarkCount++);   
  14.                 } else {   
  15.                     if (tok.hasMoreTokens()) {   
  16.                         value = null;   
  17.                     } else {   
  18.                         value = "";   
  19.                     }   
  20.                 }   
  21.                 buf.append("" + value);   
  22.             } catch (Throwable e) {   
  23.                 buf.append(   
  24.                     "ERROR WHEN PRODUCING QUERY STRING FOR LOG."  
  25.                         + e.toString());   
  26.                 // catch this without whining, if this fails the only thing wrong is probably this class   
  27.             }   
  28.         }   
  29.         return buf.toString().trim();   
  30.     }   

初始化参数列表的方法:

java 代码
  1. private void saveQueryParamValue(int position, Object obj) {   
  2.         String strValue;   
  3.         if (obj instanceof String || obj instanceof Date) {   
  4.             // if we have a String or Date , include '' in the saved value   
  5.             strValue = "'" + obj + "'";   
  6.         } else {   
  7.   
  8.             if (obj == null) {   
  9.                 // convert null to the string null   
  10.                 strValue = "null";   
  11.             } else {   
  12.                 // unknown object (includes all Numbers), just call toString   
  13.                 strValue = obj.toString();   
  14.             }   
  15.         }   
  16.   
  17.         // if we are setting a position larger than current size of parameterValues, first make it larger   
  18.         while (position >= parameterValues.size()) {   
  19.             parameterValues.add(null);   
  20.         }   
  21.         // save the parameter   
  22.         parameterValues.set(position, strValue);   
  23.     }  
分享到:
评论
4 楼 heyajun945 2012-09-26  
这个怎么用呢?
LoggableStatement stmt = (LoggableStatement) conn.prepareStatement(sql);
这样用不行啊
3 楼 抛出异常的爱 2007-03-21  
jvincent 写道
唉,被人评到新手帖,又扣了10分...
改改
把代码删掉
说出你用的场景
再把关键代码放上来

你写的帖子
关注点被无用的代码分离了....
非常希望这种实例的讨论多一点
2 楼 jvincent 2007-03-21  
唉,被人评到新手帖,又扣了10分...
1 楼 yuga 2007-03-20  
好东西,刚才下了使用了一下,感觉不错,特别是调试SQL语句的时候.强.

相关推荐

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

    在实际应用中,如果需要获取动态构建的SQL,可能需要自定义一个`PreparedStatement`的代理类,覆盖`execute`或`executeQuery`方法,然后在这个代理类中拼接和打印出最终的SQL。但这需要对JDBC有深入的理解,并且需要...

    PreparedStatement

    jdbc2.0版 PreparedStatement接口的用法

    java执行SQL语句实现查询的通用方法详解

    然后,使用PreparedStatement来执行SQL语句,preparedstatement.setObject()方法来设置SQL语句中的参数。最后,使用executeQuery()方法来执行SQL语句,并将查询结果放入Vector容器,以便其他程序使用。 二、...

    Statement和PreparedStatement之间的区别

    而PreparedStatement对象则可以避免这种情况,因为它将用户输入的数据作为参数传入,而不是将其直接嵌入到SQL语句中。 最后,PreparedStatement对象可以提高代码的可读性和可维护性。使用PreparedStatement对象可以...

    练习3:使用PreparedStatement插入宠物信息.zip

    在Java编程中,PreparedStatement是Java SQL API中的一个接口,它是Statement接口的子接口。这个练习主要涉及如何使用PreparedStatement来插入宠物信息到数据库中。PreparedStatement的主要优势在于它的预编译能力和...

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

    总之,`SqlUtils`工具类是Java开发中处理SQL查询的利器,它可以简化SQL条件的构建,提升代码质量,降低潜在的安全风险。通过理解和利用这样的工具类,开发者能够更专注于业务逻辑,而不是底层的SQL拼接细节。

    sqljdbc驱动类

    标题中的"sqljdbc驱动类"指的是sqljdbc4.jar或sqljdbc42.jar等驱动包,这些是微软官方发布的JDBC驱动实现,适用于Java 8及更高版本。通过这个驱动,开发者可以使用Java语言方便地连接到SQL Server数据库,执行查询、...

    PreparedStatement详细用法

    `PreparedStatement`是Java JDBC API中的一个关键类,用于执行预编译的SQL语句。它继承自`Statement`类,并在其基础上提供了更多的功能和优化。在Java应用程序与数据库交互的过程中,`PreparedStatement`的使用能够...

    java中PreparedStatement和Statement的区别

    首先,从数据库执行 SQL 语句的角度来看,使用 PreparedStatement 语句可以提高数据库访问的效率。这是因为数据库会对预编译语句进行预编译,下次执行相同的 SQL 语句时,数据库端不会再进行预编译,而直接使用...

    sql语句中用问号代替参数

    注意,参数的位置是基于它们在SQL语句中出现的顺序,从1开始计数。 ### 总结 使用问号参数化查询是编写安全、高效SQL语句的关键实践。它不仅可以防范SQL注入,还能优化性能,同时减少因字符串拼接导致的潜在错误。...

    PreparedStatement 详细用法

    在Java编程语言中,`PreparedStatement`是`java.sql`包中的一个接口,它继承自`Statement`类,并提供了预编译SQL语句的功能。预编译SQL语句的主要优势在于提高了执行效率和安全性。尤其在处理动态查询或频繁执行相同...

    connection 和 preparedstatement 的关闭问题

    在Java编程语言中,处理数据库连接及执行SQL语句时,合理地管理和释放资源是非常重要的。本文将详细介绍`Connection`和`PreparedStatement`的使用时机与关闭策略,帮助开发者更好地理解和掌握这两者的使用方法。 ##...

    sqljdbc和sqljdbc4 sqlserver最新驱动

    压缩包中的`sqljdbc.jar`和`sqljdbc4.jar`是驱动的二进制文件,包含了实现JDBC接口的类。`sqljdbc.jar`适用于Java 6及以下版本,而`sqljdbc4.jar`适用于Java 7及以上版本。根据你的项目环境,选择合适版本的JAR文件...

    PreparedStatement接口

    NULL 博文链接:https://chaoyi.iteye.com/blog/2088080

    PreparedStatement和Statement

    在Java编程中,数据库操作是常见任务之一,而`PreparedStatement`和`Statement`是Java JDBC(Java Database Connectivity)中用于执行SQL语句的两种主要接口。它们都是`java.sql`包下的类,用来与数据库进行交互,但...

    JDBC基础教程之PreparedStatement.doc

    `PreparedStatement`的主要特点在于它可以预先编译SQL语句,并允许用户在执行前动态地设置SQL语句中的参数值,这使得它在执行相同或相似SQL语句时比普通的`Statement`更加高效。 #### 二、`PreparedStatement`与`...

    适用SQL Server 2016版本的数据库加载驱动包——sqljdbc42.jar

    驱动包中的类和接口实现了JDBC规范,使得Java应用程序能够连接到SQL Server 2016并执行SQL命令。 这个驱动包支持JDBC 4.2规范,这也是“42”在文件名中的由来。JDBC 4.2规范包含了更多高级特性,如JSON支持、大结果...

    Java防止SQL注入的几个途径

    Java 防止 SQL 注入的几个途径 Java 防止 SQL 注入是一个非常...防止 SQL 注入需要从多方面入手,包括杜绝 SQL 拼接、使用 PreparedStatement、过滤用户的输入等。只有通过这些措施,才能有效地防止 SQL 注入攻击。

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    在Java的JDBC编程中,`PreparedStatement`是一个非常重要的接口,它提供了预编译的SQL语句功能,能够显著提高执行效率,尤其是在批量处理大量数据时。`PreparedStatement`也被称为JDBC存储过程,因为它允许开发者...

    关于PreparedStatement插入Date类型值的方法.txt

    在Java编程语言中,使用`PreparedStatement`来执行SQL语句是一种常见的操作数据库的方式。这种方式不仅可以提高程序的性能,还可以有效地防止SQL注入攻击。当我们在应用程序中需要向数据库中插入日期(`Date`类型)...

Global site tag (gtag.js) - Google Analytics