2010-06-14 8 views

Odpowiedz

11

Nie jest to wymagane przez specyfikację JDBC, ale kilka sterowników JDBC zezwala na toString z PreparedStatement sortowania zwrotnego zapytania, które będzie uruchamiane, a złącze/J MySQL będzie miało takie zachowanie (lub przynajmniej kilka lat temu).

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

dziękuję! Metoda stmt.toString() rozwiązała problem. – ufk

+0

Jeśli metoda stmt.toString() nie działa, spróbuj zastosować rozwiązanie opisane w tym artykule: http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-overpower.html?page= 1 –

+0

Działa również na sterownik PostgreSQL (9.1). –

3

Nie można, ponieważ Java nie jest odpowiedzialna za jej skonstruowanie. Przygotowane instrukcje są obsługiwane w MySQL, więc Java wysyła rzeczywisty sparametryzowany SQL ("wybierz identyfikator od użytkownika, którego nazwa =?") Bezpośrednio do MySQL wraz z parametrami

+0

Właściwie niektóre sterowniki JDBC wykonują pracę po stronie klienta i wysyłają na serwer sparametryzowane zapytanie (nie wiem w jaki sposób sterownik MySQL używa). Nie ma znormalizowanego sposobu na uzyskanie "kompletnego" komunikatu SQL. –

+0

@ Joachim Sauer: Złącze MySQL/J 3.1 i nowsze będą przygotowane instrukcje po stronie serwera. – Powerlord

3

Mogę ci powiedzieć, co to jest. Jeśli używasz MySQL 4.1 lub nowszy z Connector/J 3.1 lub nowszy, to będzie coś takiego:

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

To dlatego MySQL obsługuje server-side prepared statements.

(bardziej prawdopodobne używa protokołu binarnego, ale ten kod jest tylko do punktu)

4

Naprawdę nie można wydostać się zapytanie, które zostanie wykonane, ale nie logujesz API, które będą dziennika bazy danych zwraca na ciebie takie jak log4jdbc i.

2

Hi zaimplementować następujący kod, który pobierał SQL z PreparedStatement. Nie trzeba używać żadnego słoika i sterownika.

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

Nieco odmienne podejście od wszystkich odpowiedzi Tutaj

Jeśli jesteś zaznajomiony z opcji debugowania w Eclipse. Możesz spróbować wykonać następujące czynności:

  1. ustawić punkt przerwania w stmt.executeQUery();

  2. Kliknij prawym przyciskiem myszy aplikację, powiedzmy Debug As wybrać Java Application (lub cokolwiek zastosowanie w Twoim przypadku to znaczy mogą być SpringBoot App itp

  3. Wykonaj czynność, która doprowadzi Cię do kodu wymienionego w pytaniu:

  4. Jeśli sprawdzisz Variables tab w Debug Perspective Eclipse znajdziesz zmienne jak myQuery, stmt (według kodu)

  5. Cokolwiek widzisz jako wartości stmt byłoby zapytanie SQL pełny trzeba.

Ponadto, jeśli nie chcesz, aby zachować się w tej zmiennej zawsze możesz spróbować Java Logging i wydrukować Pełna zapytanie SQL w logach.

Powiązane problemy