Intenta interpretar el código de forma correcta antes de aplicarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en la sección de comentarios.
Solución:
Esto no está definido en ninguna parte del contrato API de JDBC, pero si está suerteel controlador JDBC en cuestión puede devolver el SQL completo simplemente llamando PreparedStatement#toString()
. Es decir
System.out.println(preparedStatement);
Según mi experiencia, los que lo hacen son al menos los controladores JDBC de PostgreSQL 8.x y MySQL 5.x. En el caso de que su controlador JDBC no lo admita, lo mejor que puede hacer es usar un contenedor de declaraciones que registre todos setXxx()
métodos y finalmente llena un SQL string sobre toString()
en base a la información registrada. Por ejemplo, Log4jdbc o P6Spy.
Podrías intentar llamar toString()
en la declaración preparada después de haber establecido los valores de vinculación.
PreparedStatement query = connection.prepareStatement(aSQLStatement);
System.out.println("Before : " + query.toString());
query.setString(1, "Hello");
query.setString(2, "World");
System.out.println("After : " + query.toString());
Esto funciona cuando usa el controlador JDBC MySQL, pero no estoy seguro de si funcionará en otros casos. Es posible que deba realizar un seguimiento de todos los enlaces que realice y luego imprimirlos.
Ejemplo de salida del código anterior.
Before : [email protected]: SELECT * FROM test WHERE blah1=** NOT SPECIFIED ** and blah2=** NOT SPECIFIED **
After : [email protected]: SELECT * FROM test WHERE blah1='Hello' and blah2='World'
Para aquellos de ustedes que buscan una solución para Oracle, hice un método a partir del código de Log4Jdbc. Deberá proporcionar la consulta y los parámetros pasados a la declaración preparada, ya que recuperarlos es un poco complicado:
private String generateActualSql(String sqlQuery, Object... parameters)
String[] parts = sqlQuery.split("\?");
StringBuilder sb = new StringBuilder();
// This might be wrong if some '?' are used as litteral '?'
for (int i = 0; i < parts.length; i++)
String part = parts[i];
sb.append(part);
if (i < parameters.length)
sb.append(formatParameter(parameters[i]));
return sb.toString();
private String formatParameter(Object parameter)
if (parameter == null)
return "NULL";
else
if (parameter instanceof String)
return "'" + ((String) parameter).replace("'", "''") + "'";
else if (parameter instanceof Timestamp)
return "to_timestamp('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS").
format(parameter) + "', 'mm/dd/yyyy hh24:mi:ss.ff3')";
else if (parameter instanceof Date)
return "to_date('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").
format(parameter) + "', 'mm/dd/yyyy hh24:mi:ss')";
else if (parameter instanceof Boolean)
return ((Boolean) parameter).booleanValue() ? "1" : "0";
else
return parameter.toString();