它在 JDBC API 合约中没有定义,但如果你很幸运,有问题的 JDBC 驱动程序可能只需调用 就返回完整的 SQL。即PreparedStatement#toString()
System.out.println(preparedStatement);
至少MySQL 5.x和PostgreSQL 8.x JDBC驱动程序支持它。但是,大多数其他 JDBC 驱动程序不支持它。如果你有这样的,那么你最好的选择是使用Log4jdbc或P6Spy。
或者,您也可以编写一个泛型函数,该函数采用 、 SQL 字符串和语句值,并在记录 SQL 字符串和值后返回 a。开球示例:Connection
PreparedStatement
public static PreparedStatement prepareStatement(Connection connection, String sql, Object... values) throws SQLException {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < values.length; i++) {
preparedStatement.setObject(i + 1, values[i]);
}
logger.debug(sql + " " + Arrays.asList(values));
return preparedStatement;
}
并将其用作
try {
connection = database.getConnection();
preparedStatement = prepareStatement(connection, SQL, values);
resultSet = preparedStatement.executeQuery();
// ...
另一种选择是实现一个自定义,该自定义在构造时包装(装饰)real并覆盖所有方法,以便它调用real的方法并收集所有方法中的值,并在调用其中一个方法时懒惰地构造“actual”SQL字符串(这是一项相当大的工作,但大多数IDE都为装饰器方法提供了自动生成器, Eclipse 确实如此)。最后,只需使用它即可。这基本上也是P6Spy和妃子们已经在引擎盖下做的事情。PreparedStatement
PreparedStatement
PreparedStatement
setXXX()
executeXXX()