WEB开发网
开发学院软件开发Java JDBC 查询日志变得简单:使用增强型PreparedState... 阅读

JDBC 查询日志变得简单:使用增强型PreparedStatement向JDBC代码增加日志功能

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 表5:saveQueryParamValue()方法privatevoidsaveQueryParamValue(intposition,Objectobj){StringstrValue;if(objinstanceofString||objinstanceofDate){//ifwehave


表5:saveQueryParamValue()方法
 private void saveQueryParamValue(int position, Object obj) { 
   String strValue; 
   if (obj instanceof String || obj instanceof Date) { 
      // if we have a String, include '' in the saved value 
      strValue = "'" + obj + "'"; 
   } else { 
      if (obj == null) { 
        // convert null to the string null 
         strValue = "null"; 
      } else { 
        // unknown object (includes all Numbers), just call toString 
        strValue = obj.toString(); 
      } 
   } 
   // if we are setting a position larger than current size of 
   // parameterValues, first make it larger 
   while (position >= parameterValues.size()) { 
      parameterValues.add(null); 
   } 
   // save the parameter 
   parameterValues.set(position, strValue); 
 } 

当我们使用标准方法来设置所有参数时,我们在 LoggableStatement 中简单调用 getQueryString() 方法来获得查询字符串。所有问号都将被真正的参数值替换,它准备输出到我们选定的日志目的地。

使用LoggableStatement

表6显示如何更改表1和表2中的代码来使用 LoggableStatement 。将 LoggableStatement 引入到我们的应用程序代码中可以解决复制的参数变量问题。如果改变了SQL模板,我们只需更新 PreparedStatement 上的参数设置调用(例如添加一个 pstmt.setString(3,"new-param-value") )。这一更改将在日志输出结果中反映出,无需任何记录代码的手工更新。


表6:使用LoggableStatement 
  String sql = "select foo, bar from foobar where foo < ? and bar = ?"; 
  long fooValue = 99; 
  String barValue = "christmas"; 
  Connection conn = dataSource.getConnection(); 
  PreparedStatement pstmt; 
  if(logEnabled) // use a switch to toggle logging. 
    pstmt = new LoggableStatement(conn,sql); 
  else 
    pstmt = conn.prepareStatement(sql); 
  pstmt.setLong(1,fooValue); 
  pstmt.setString(2,barValue); 
  if(logEnabled) 
    System.out.println("Executing query: "+ 
     ((LoggableStatement)pstmt).getQueryString()); 
  ResultSet rs = pstmt.executeQuery(); 

结束语

使用本文介绍的非常简单的步骤,您可以为查询记录扩展JDBC PreparedStatement 接口。我们在此处使用的技术可以被视为“通过封装来实现扩展”,或作为Decorator设计模式的一个实例。通过封装来实现扩展在当您必须扩展API但subclassing不是一项可选功能时极其有用。

上一页  1 2 3 4 5 

Tags:JDBC 查询 日志

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接