Как я могу получить SQL PreparedStatement? - PullRequest
139 голосов
/ 04 марта 2010

У меня есть общий метод Java со следующей сигнатурой метода:

private static ResultSet runSQLResultSet(String sql, Object... queryParams)

Он открывает соединение, создает PreparedStatement с помощью оператора sql и параметров в массиве переменной длины queryParams, запускает его, кэширует ResultSetCachedRowSetImpl), закрывает соединение и возвращает кэшированный набор результатов.

У меня есть обработка исключений в методе, который регистрирует ошибки. Я записываю SQL-оператор как часть журнала, так как он очень полезен для отладки. Моя проблема заключается в том, что запись в строковую переменную sql регистрирует оператор шаблона с? Вместо фактических значений. Я хочу записать фактический оператор, который был выполнен (или попытался выполнить).

Итак ... Есть ли способ получить фактический оператор SQL, который будет выполняться PreparedStatement? ( Без создания его самостоятельно. Если я не смогу найти способ доступа к PreparedStatement's SQL, я, вероятно, в конечном итоге сам создам его в моих catch es.)

Ответы [ 13 ]

0 голосов
/ 07 февраля 2016

Просто функция:

public static String getSQL (Statement stmt){
    String tempSQL = stmt.toString();

    //please cut everything before sql from statement
    //javadb...: 
    int i1 = tempSQL.indexOf(":")+2;
    tempSQL = tempSQL.substring(i1);

    return tempSQL;
}

Это хорошо для подготовленного заявления.

0 голосов
/ 04 марта 2010

Если вы используете MySQL, вы можете регистрировать запросы, используя Журнал запросов MySQL . Я не знаю, предоставляют ли другие поставщики эту функцию, но скорее всего, они делают.

0 голосов
/ 04 марта 2010

Для этого вам нужно JDBC-соединение и / или драйвер, который поддерживает ведение журнала sql на низком уровне.

Взгляните на log4jdbc

...