Этот вопрос уже имеет ответ здесь:
В моем коде я использую java.sql.PreparedStatement
.
Я затем выполняюсь setString()
метод для заполнения подстановочных знаков подготовленного оператора.
Есть ли способ для меня получить (и распечатать) заключительный запрос перед executeQuery()
метод называют, и запрос выполняется? Я Просто хочу это для отладки целей.
Это нигде не определено в контракте JDBC API, но если вам повезло , рассматриваемый драйвер JDBC может вернуть полный SQL, просто вызвав PreparedStatement # toString ()
. Т.е.
System.out.println(preparedStatement);
По моему опыту, это как минимум JDBC-драйверы PostgreSQL 8.x и MySQL 5.x. В случае, если ваш драйвер JDBC не поддерживает его, лучше всего использовать оболочку операторов, которая регистрирует все методы setXxx ()
и, наконец, заполняет строку SQL на основе toString ()
. по зарегистрированной информации. Например, Log4jdbc или P6Spy .
Вы можете попробовать вызвать 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'