2010-06-14 42 views
8

我正在使用PreparedStatement與MySQL服務器。我可以獲得PreparedStatement即將執行的完整查詢嗎?

例如:

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

我怎樣才能收到完整的SQL查詢將要被MySQL服務器上執行?

謝謝!

回答

11

它不是JDBC規範所要求的,但有幾個JDBC驅動程序讓PreparedStatementtoString返回排序 - 即將運行的查詢,而MySQL的Connector/J碰巧有這種行爲(或者至少它做了一個幾年前)。

String myQuery = "select id from user where name = ?"; 
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery); 
stmt.setString(1, "test"); 
System.out.println(stmt); // May do what you want! 
+0

謝謝! stmt.toString()解決了這個問題。 – ufk 2010-06-14 16:03:25

+0

如果stmt.toString()不起作用,請嘗試遵循本文提供的解決方案: http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-overpower.html?page= 1 – 2013-08-07 13:10:10

+0

它也適用於Postgres驅動程序(9.1)。 – 2015-07-30 09:36:30

3

你不能,因爲Java不負責構造它。編寫的語句在MySQL中受支持,所以Java會將實際參數化的SQL(「select id from user where name =?」)直接發送到MySQL以及參數

+0

實際上,一些JDBC驅動程序在客戶端完成工作並向服務器發送完全參數化的查詢(我不知道MySQL驅動程序使用哪種方式)。無論如何,沒有標準化的方式來獲得「完整的」SQL語句。 – 2010-06-14 15:37:12

+0

@Joachim Sauer:MySQL Connector/J 3.1和更新的版本將用戶服務器端準備好的語句。 – Powerlord 2010-06-14 15:41:14

3

我可以告訴你它是什麼。如果你使用MySQL 4.1或更高版本與連接器/ J 3.1或更高版本,這將是這樣的:

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

這是因爲MySQL支持server-side prepared statements

(更可能的是它採用了二進制協議,但是這個代碼只是提出一個觀點)

4

你真的無法擺脫將要執行的查詢,但有記錄的API,將記錄數據庫要求你如log4jdbcp6spy

2

您好我執行下面的代碼從獲取SQL的PreparedStatement。無需使用任何jar和Driver。

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[" + "] ..."); 
      } 

    } 
0

從這裏所有的答案稍有不同的方法,

如果您熟悉Eclipse中的調試選項。你可以嘗試以下方法:

  1. 設置爲stmt.executeQUery();

  2. 斷點右鍵單擊應用程序,說Debug As選擇Java Application(或任何適合你的情況,即可能是SpringBoot應用等

  3. 執行步驟,讓您的問題中提到的代碼

  4. 如果您檢查Variables tab在Eclipse中的,你會(根據您的代碼)

  5. 不管你看到作爲stmt值是需要完整的SQL查詢發現像myQuerystmt變量。

另外,如果你不想守望着這個變量總是您可以嘗試Java Logging並打印在記錄您的全部SQL查詢。

相關問題