Я столкнулся с другим решением этой проблемы.
Драйвер MySQL JDBC переопределяет toString of PreparedStatement, чтобы отобразить запрос при отправке в базу данных. Это зависит от реализации, поэтому на нее нельзя положиться, но к ней очень просто добраться. Сейчас я использую это для выгрузки текста запроса в файл журнала для целей отладки. Хотя, возможно, есть и другие решения, которые являются более переносимыми и ориентированными на будущее, это дает преимущество в получении именно той строки, которую драйвер MySQL сообщает, что отправляет в базу данных.
Строка возвращается с идентификатором объекта, затем двоеточием, затем строкой SQL. Вы можете разделить его на двоеточие, чтобы получить только SQL.
Тип com.mysql.jdbc.PreparedStatement также предоставляет вызов защищенного метода asSql (). Вы можете переопределить класс своей собственной реализацией, которая предоставляет открытый доступ к этому методу. Из анализа дизассемблирования метода класса toString () кажется, что он использует asSql () для получения реальной строки SQL. Этот подход добавляет проблему того, как создать экземпляр вашего подкласса; самый простой подход состоит в том, чтобы просто использовать toString, к которой у вас уже есть доступ, даже без необходимости понижать ваш PreparedStatement до специфичного для MySQL подтипа.
Опять же, просто имейте в виду, что разработчики MySQL API, вероятно, не рассматривают эту часть открытого интерфейса со своим программным обеспечением (JDBC определяет стандартный интерфейс), поэтому они могут внести изменения позже, что нарушит этот механизм. В настоящее время, однако, он выполнит свою работу.
Это верно для версии драйвера MySQL, которую я сейчас использую, а именно 5.1.7.