11 Stimmen

Kann ich die vollständige Abfrage erhalten, die ein PreparedStatement im Begriff ist, auszuführen?

Ich arbeite mit PreparedStatement mit dem MySQL-Server.

Beispiel:

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

Wie kann ich die vollständige SQL-Abfrage die demnächst auf der MySQL Server ?

12voto

gustafc Punkte 27673

Es ist in der JDBC-Spezifikation nicht vorgeschrieben, aber mehrere JDBC-Treiber lassen die toString eines PreparedStatement eine Art von Abfrage zurückgeben, die ausgeführt wird, und MySQL's Connector/J hat dieses Verhalten zufällig (oder zumindest tat es das vor ein paar Jahren).

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!

4voto

krock Punkte 27758

Sie können die Abfrage, die ausgeführt wird, nicht wirklich herausfinden, aber es gibt Protokollierungs-APIs, die Datenbankaufrufe für Sie protokollieren, wie z. B. log4jdbc et p6spy .

3voto

Michael Mrozek Punkte 160867

Das können Sie nicht, da Java nicht für die Erstellung verantwortlich ist. Prepared Statements werden von MySQL unterstützt, so dass Java das eigentliche parametrisierte SQL ("select id from user where name = ?") zusammen mit den Parametern direkt an MySQL sendet

3voto

Powerlord Punkte 84404

Ich kann Ihnen sagen, was es ist. Wenn Sie MySQL 4.1 oder eine neuere Version mit Connector/J 3.1 oder einer neueren Version verwenden, wird es in etwa so aussehen:

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

Das liegt daran, dass MySQL die Server-seitige vorbereitete Anweisungen .

(Wahrscheinlicher ist die Verwendung des Binärprotokolls, aber dieser Code dient nur der Veranschaulichung)

3voto

Hallo Ich implementiere den folgenden Code, der SQL von abrufen PreparedStatement . Keine Notwendigkeit, ein Glas und einen Treiber zu verwenden.

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

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X