Получите запрос от java.sql. PreparedStatement [дубликат]

Этот вопрос уже имеет ответ здесь:

В моем коде я использую java.sql.PreparedStatement.

Я затем выполняюсь setString() метод для заполнения подстановочных знаков подготовленного оператора.

Есть ли способ для меня получить (и распечатать) заключительный запрос перед executeQuery() метод называют, и запрос выполняется? Я Просто хочу это для отладки целей.

154
задан Mnementh 11 July 2015 в 12:29
поделиться

2 ответа

Это нигде не определено в контракте JDBC API, но если вам повезло , рассматриваемый драйвер JDBC может вернуть полный SQL, просто вызвав PreparedStatement # toString () . Т.е.

System.out.println(preparedStatement);

По моему опыту, это как минимум JDBC-драйверы PostgreSQL 8.x и MySQL 5.x. В случае, если ваш драйвер JDBC не поддерживает его, лучше всего использовать оболочку операторов, которая регистрирует все методы setXxx () и, наконец, заполняет строку SQL на основе toString () . по зарегистрированной информации. Например, Log4jdbc или P6Spy .

153
ответ дан 23 November 2019 в 22:02
поделиться

Вы можете попробовать вызвать 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'
28
ответ дан 23 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: