我可以获得PreparedStatement即将执行的完整查询吗?

时间:2010-06-14 15:32:01

标签: java mysql prepared-statement

我正在使用PreparedStatement与MySQL服务器。

示例:

String myQuery = "select id from user where name = ?";
PreparedStatement stmt  = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
stmt.executeQUery();
ResultSet rs = stmt.getResultSet();

如何收到即将在MySQL服务器上执行的完整SQL查询?

谢谢!

6 个答案:

答案 0 :(得分:10)

这不是JDBC规范的强制要求,但是有几个JDBC驱动程序让toString的{​​{1}}返回将要运行的查询的排序,并且MySQL的Connector / J碰巧有这种行为(或者至少几年前做过)。

PreparedStatement

答案 1 :(得分:4)

您无法真正了解将要执行的查询,但有一些日志API会记录您的数据库调用,例如log4jdbcp6spy

答案 2 :(得分:3)

你不能,因为Java不负责构建它。 MySQL中支持预编译语句,因此Java将实际参数化SQL(“select id from user where name =?”)直接发送到MySQL以及参数

答案 3 :(得分:3)

我可以告诉你它是什么。如果您使用的是带有Connector / J 3.1或更高版本的MySQL 4.1或更高版本,它将类似于:

PREPARE stmt FROM 'select id from user where name = ?'
SET @a = 'test'
EXECUTE stmt USING @a

这是因为MySQL支持server-side prepared statements

(更有可能它使用二进制协议,但这段代码只是为了说明一点)

答案 4 :(得分:3)

您好我实现了以下从 PreparedStatement 获取SQL的代码。无需使用任何jar和驱动程序。

public void printSqlStatement(PreparedStatement preparedStatement, String sql) throws SQLException{
        String[] sqlArrya= new String[preparedStatement.getParameterMetaData().getParameterCount()];
        try {
               Pattern pattern = Pattern.compile("\\?");
               Matcher matcher = pattern.matcher(sql);
               StringBuffer sb = new StringBuffer();
               int indx = 1;  // Parameter begin with index 1
               while (matcher.find()) {
             matcher.appendReplacement(sb,String.valueOf(sqlArrya[indx]));
               }
               matcher.appendTail(sb);
              System.err.println("Executing Query [" + sb.toString() + "] with Database[" + "] ...");
               } catch (Exception ex) {
                   System.err.println("Executing Query [" + sql + "] with Database[" +  "] ...");
            }

    }

答案 5 :(得分:0)

这里所有答案的方法略有不同,

如果您熟悉Eclipse中的调试选项。您可以尝试以下方法:

  1. 将断点设置为stmt.executeQUery();

  2. 右键单击您的应用程序,说Debug As选择Java Application(或在您的情况下适用于哪种情况,即可能是SpringBoot App等。

  3. 执行步骤,让您获得问题中提到的代码。

  4. 如果您检查Eclipse Variables tab中的Debug Perspective,您会发现myQuerystmt等变量(根据您的代码)

    < / LI>
  5. 无论您认为stmt的值是什么,都将是您需要的完整SQL查询。

  6. 此外,如果您不想继续查看此变量,可以尝试Java Logging并在日志中打印完整SQL查询。