Это нигде не определено в контракте API JDBC, но если вам повезет, драйвер JDBC, о котором идет речь, может вернуть полный SQL, просто позвонив PreparedStatement#toString()
. I.e.
System.out.println(preparedStatement);
По крайней мере MySQL 5.x и PostgreSQL 8.x поддерживают JDBC-драйверы. Однако большинство других драйверов JDBC его не поддерживают. Если у вас есть такой, то лучше всего использовать Log4jdbc или P6Spy .
В качестве альтернативы вы также можете написать общую функцию, которая принимает значение Connection
, строку SQL и значения оператора и возвращает PreparedStatement
после регистрации строки SQL и значений. Пример Kickoff:
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();
// ...
Другой альтернативой является реализация пользовательского PreparedStatement
, который обертывает (украшает) real PreparedStatement
по построению и переопределяет все методы, чтобы он вызывал методы real PreparedStatement
и собирал значения во всех методах setXXX()
и лениво конструировал «фактическую» строку SQL когда вызывается один из методов executeXXX()
(довольно много работы, но большинство IDE обеспечивает автогенераторы для методов декоратора, Eclipse делает). Наконец, просто используйте его. Это также в основном то, что P6Spy и супруги уже делают под капотами.