在我的代码中,我使用了java.sql.PreparedStatement
。
然后,我执行setString()
方法来填充预准备语句的通配符。
在调用executeQuery()
方法并执行查询之前,有没有办法检索(并打印出)最终的查询?我只是想要这是为了调试的目的。
发布于 2010-04-21 21:31:26
在设置了绑定值之后,您可以尝试在准备好的语句上调用toString()
。
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());
当您使用JDBC MySQL驱动程序时,这是有效的,但我不确定在其他情况下是否有效。您可能需要跟踪您所做的所有绑定,然后打印出来。
以上代码的输出示例。
Before : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1=** NOT SPECIFIED ** and blah2=** NOT SPECIFIED **
After : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1='Hello' and blah2='World'
发布于 2014-07-14 18:18:58
对于那些正在寻找Oracle解决方案的人,我从Log4Jdbc的代码中创建了一个方法。您将需要提供传递给preparedStatement的查询和参数,因为从它检索它们有点麻烦:
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();
}
}
}
发布于 2012-05-15 20:00:59
您可以将log4jdbc添加到项目中。这增加了sql命令执行时的日志记录,以及许多其他信息。
https://stackoverflow.com/questions/2683214
复制相似问题