2016-04-25 4 views
2

Ich versuche, eine Verbindung zu einer Datenbank herzustellen, eine Abfrage auszuführen und die Abfrage auszudrucken. Bisher, was ich habe funktioniert, aber ich brauche, um die Ausgabe zu erhalten und einen bestimmten Teil davon zu einem I StringAbfrage von PreparedStatement von Derby erhalten

public static void main(String args[]) { 
     BasicConfigurator.configure(); 
     Logger.getGlobal().setLevel(Level.INFO); 
     PreparedStatement preparedStatement = null; 
     try { 
      connect(); 
      String sql = "SELECT * FROM foo WHERE ID = ?"; 
      preparedStatement = connection.prepareStatement(sql); 
      preparedStatement.setInt(1, 1); 
      try (ResultSet resultSet = preparedStatement.executeQuery()) { 
       while (resultSet.next()) { 
        break; 
       } 
      } 
      //String usedSql = "query should go here"; 
     } catch (SQLException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      if (preparedStatement != null) { 
       try { 
        preparedStatement.close(); 
       } catch (SQLException ex) { 
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
      disconnect(); 
     } 
    } 

zuweisen bin log4jdbc mit auf meine Fragen spionieren.

Im Moment bekomme ich protokollierte Ausgabe wie:

594 [main] DEBUG jdbc.foo - 1. Connection.new Connection returned java.sql.DriverManager.getConnection(DriverManager.java:664) 
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.new PreparedStatement returned com.example.Test.main(Test.java:63) 
608 [main] DEBUG jdbc.foo - 1. Connection.prepareStatement(SELECT * FROM foo WHERE ID = ?) returned [email protected] com.example.Test.main(Test.java:63) 
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.setInt(1, 1) returned com.example.Test.main(Test.java:64) 
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.setMaxRows(1) returned com.example.Test.main(Test.java:65) 
609 [main] DEBUG jdbc.sqlonly - com.example.Test.main(Test.java:66) 
1. SELECT * FROM foo WHERE ID = 1 

Ich mag SELECT * FROM foo WHERE ID = 1 zu usedSql zuzuzuweisen. Wie kann ich das tun?

+0

Was bedeutet 'preparedStatement.toString()' Sie geben? – Berger

+0

@Berger: 'net.sf.log4jdbc.PreparedStatementSpy @ 7d70d1b1' – Hooli

+0

Ich denke, das ist bereits [hier] beantwortet (http://stackoverflow.com/questions/2382532/how-can-i-get-the-sql- of-a-preparedstatement) – soufrk

Antwort

1

Normalerweise gibt Ihnen preparedStatement.toString() die Abfrage (inkl. Gebundene Parameter). Aber es hängt von der tatsächlichen Implementierung der PreparedStatement ab (mit dem PostgreSQL impl funktioniert das zum Beispiel).

Sie erwähnten, dass preparedStatement.toString()[email protected] für Sie zurückgibt. Ich bin nicht vertraut mit log4jdbc aber ich sehe aus wie PreparedStatementSpy ist Ihre tatsächliche PreparedStatement wickeln. Um es von Ihrem preparedStatement versuchen so etwas wie

if(preparedStatement instanceof PreparedStatementSpy) 
    usedSql = ((PreparedStatementSpy) preparedStatement).getRealStatement().toString(); 

bearbeiten: da Sie verwenden Derby eine einfache toString() nicht tun. Eine Möglichkeit, um dies zu verwenden, könnte PreparedStatementSpy.dumpedSql() sein, die die gleiche Zeichenfolge log4jdbc für die Protokollierung zurückgibt. Leider ist es ein geschützt Methode und Sie haben Reflexion zu verwenden:

if (preparedStatement instanceof PreparedStatementSpy) { 
    Method m = PreparedStatementSpy.class.getDeclaredMethod("dumpedSql"); 
    m.setAccessible(true); 
    usedSql = (String) m.invoke(preparedStatement); 
} 
// omitted exception handling 
+0

PreparedStatement implementiert [java.sql.Wrapper] (https://docs.oracle.com/javase/7/docs/api/java/sql/Wrapper.html), was eine weitere Möglichkeit sein könnte, um auf die Zielanweisung zuzugreifen. – jmehrens

+0

Ich benutze Derby eingebettet, weil es am schnellsten ist. Ich bin mir nicht sicher, was "PreparedStatementSpy" ist, aber log4jdbc fungiert als Proxy zwischen der Datenbank und Ihrer Anwendung, um zusätzliche Informationen über die Kommunikation zwischen ihnen bereitzustellen. – Hooli

+0

@Hooli sehe mein Update für ein Beispiel, das mit 'Derby' funktionieren könnte – nyname00