Это не предусмотрено спецификацией JDBC, но несколько драйверов JDBC позволяют toString
из PreparedStatement
возвращать своего рода запрос, который будет выполнен, а MySQL's Connector/J, как оказалось, имеет такое поведение (или, по крайней мере, имел несколько лет назад).
String myQuery = "select id from user where name = ?";
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
System.out.println(stmt); // May do what you want!
На самом деле вы не можете получить запрос, который будет выполняться, но есть API-интерфейсы журналирования, которые будут регистрировать запросы к базе данных для вас, такие как log4jdbc и p6spy .
Я могу вам сказать, что это такое. Если вы используете MySQL 4.1 или новее с Connector / J 3.1 или новее, это будет примерно так:
PREPARE stmt FROM 'select id from user where name = ?'
SET @a = 'test'
EXECUTE stmt USING @a
Это потому, что MySQL поддерживает подготовленные операторы на стороне сервера .
(Скорее всего, он использует двоичный протокол, но этот код просто указывает на мысль)
Вы не можете, поскольку Java не несет ответственности за его создание. Подготовленные операторы поддерживаются в MySQL, поэтому Java отправляет фактический параметризованный SQL («выберите идентификатор пользователя, где имя =?») Прямо в MySQL вместе с параметрами