请教 如何得到 conn.prepareStatement 最终执行的sql 语句。
stmt = con.prepareStatement(sql);
sql="update table1 set a=?,b=?"
stmt.setObjec t(1,"a");
stmt.setObjec t(2,"b");
希望可以通过
stmt或者conn 得到update table1 set a='a',b='b'

解决方案 »

  1.   

    应该得不到吧,object是字符串可以直接写成set a='a',b='b',如果是别的类型的怎么写?
      

  2.   

    可用setString(..), setInt(...), setDate(...) ....
      

  3.   

    有String sql的,干吗还要通过stmt、conn得到
      

  4.   

    sql="update table1 set a='a',b='b'"
      

  5.   

    要得到sql
    1.调试sql 语句
    2.写sql log。
      

  6.   

    conn.prepareStatement(..)本身不可能得到拼装后的sql语句但是也不是没有办法解决的,那就是把PreparedStatement类继承并扩展一下,增加你需要的功能
      

  7.   

    恐怕不行,如果要看到sql语句,还是用拼接的方法吧。
      

  8.   

    最终执行的语句就是 "update table1 set a=?,b=?"。这个语句被编译成二进制代码,这段二进制代码接受两个参数。楼主想想,怎么会有最终的执行语句呢,若是有的话,PreparedStatment 和 Statment 还有什么不同呢?但办法还是有的,只是太老实了一些:String sqlForLogAndDebug = ="update table1 set a="+ ... + ",b="+ ...;老实不好吗?:)
      

  9.   

    可用setString(..), setInt(...), setDate(...) ....
      

  10.   

    借助第三方工具,在JDBC的驱动做手脚,比如p6spy
      

  11.   

    预编译  用这些setString(..), setInt(...), setDate(...)
    就可以拉
     stmt = con.prepareStatement(sql);
    sql="update table1 set a=?,b=?" 
    stmt.setString(1,"a");
    stmt.setString(2,"b");
      

  12.   

    不知道你得到这个是干吗,不过如果你是想验证下语句对错与否的话,可以投机取巧嘛,把那些问号换成比如 X1 X2 然后用你SETXXX进去的字符替换他们,打印出来,不就可以了嘛。
      

  13.   

    测试的时候通常用string来写的,如果调不通就out.println一下看看有没有问题
      

  14.   

    同意楼上大虾们所说,PreparedStatement 的作用并不是 "帮你拼凑 SQL" 这个功能,prepare 之后,要对数据库进行的操作被优化了,底层并不是以一个 sql 语句提交给数据库的。因此,这个语句应该是得不到的,或者说不存在这个语句。
      

  15.   

    谢谢大家,查了jdk,发现PreparedStatement
      

  16.   

    谢谢大家,查了jdk,发现PreparedStatement
    确实没有提供拼sql功能,由于项目中要求出sql log,再者为调试方便,偶自己写了个方法,凑合能用。改天贴出来共享。
      

  17.   

    private static String getSQL(String targetStr, Object[] sqlValues) {
    StringTokenizer token = new StringTokenizer(targetStr, "?", false);
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < sqlValues.length; i++) {
    buf.append(token.nextToken());
    buf.append("'" + sqlValues[i] + "'");
    }
    return buf.toString();
    }