2010-06-14 9 views
8

Estoy trabajando con PreparedStatement con el servidor MySQL.¿Puedo obtener la consulta completa de que un PreparedStatement está a punto de ejecutarse?

ejemplo:

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

¿Cómo puedo recibir la consulta SQL completa que está a punto de ser ejecutado en el servidor MySQL?

gracias!

Respuesta

11

No es un mandato de la especificación JDBC, pero varios controladores JDBC dejar que el toString de un retorno clase-de la consulta que se ejecutará PreparedStatement, y de MySQL Connector/J pasa a tener este comportamiento (o al menos lo hizo una hace pocos años).

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

¡gracias! stmt.toString() resolvió el problema. – ufk

+0

Si stmt.toString() no funciona, intente seguir la solución proporcionada en este artículo: http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-overpower.html?page= 1 –

+0

También funciona en el controlador de Postgres (9.1). –

3

No puede, ya que Java no es responsable de construirlo. Las declaraciones preparadas son compatibles con MySQL, por lo que Java envía el SQL parametrizado real ("select id from user where name =?") Directamente a MySQL junto con los parámetros

+0

En realidad, algunos controladores JDBC hacen el trabajo en el lado del cliente y envían una consulta completamente parametrizada al servidor (no sé en qué dirección utiliza el controlador MySQL). No existe una forma estandarizada para obtener la declaración SQL "completa" de todos modos. –

+0

@Joachim Sauer: MySQL Connector/J 3.1 y las versiones más nuevas del usuario estarán preparadas para el servidor. – Powerlord

3

Puedo decirle lo que es. Si estás usando MySQL 4.1 o posterior con Connector/J 3.1 o posterior, será algo como:

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

Esto se debe a MySQL soporta server-side prepared statements.

(Lo más probable es que utiliza el protocolo binario, pero el código es sólo para hacer un punto)

4

Realmente no se puede salir de la consulta que se va a ejecutar, pero hay API de registro que iniciarán sesión bases de datos llama para usted como log4jdbc y p6spy.

2

Hola implementar el código siguiente, que traiga SQL desde PreparedStatement. No es necesario usar ningún jar y 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

enfoque ligeramente diferente de todas las respuestas aquí,

Si no está familiarizado con las opciones de depuración en Eclipse. Puede intentar lo siguiente:

  1. un punto de ruptura en stmt.executeQUery();

  2. Haga clic derecho en su aplicación, seleccione dicen Debug AsJava Application (o lo que es aplicable en su caso, es decir, puede haber SpringBoot App etc.

  3. Realice el paso que lo lleva al código mencionado en la Pregunta.

  4. Si marca Variables tab en Debug Perspective de Eclipse, se encuentran las variables como myQuery, stmt (de acuerdo con su código)

  5. Todo lo que ven como valor de stmt sería la consulta SQL completa que necesita.

Además, si usted no desea seguir buscando en esta variable siempre se puede intentar Java Logging e imprimir la consulta SQL completa en Registros.

Cuestiones relacionadas