Если вы посмотрите на javadocs для Statement
(суперкласс PreparedStatement
), метод docs для executeQuery(String)
и executeUpdate(String)
скажет следующее:
Примечание. Этот метод нельзя вызывать для PreparedStatement
или CallableStatement
.
Вот что вы здесь делаете: вызываете executeQuery(String)
из Statement
для PreparedStatement
объекта.
Теперь, поскольку Javadocs говорят, что вы «не можете» сделать это, фактическое поведение, которое вы получаете, не определено ... и, вероятно, зависит от драйвера JDBC. В этом случае кажется, что используемый вами драйвер MySQL интерпретирует это как означающее, что вы выполняете обновление как неподготовленный оператор, так что токены ?
НЕ интерпретируются как заполнитель параметров. Это заставляет анализатор SQL на стороне сервера сказать «синтаксическая ошибка».
(Для программистов было бы легче, если бы драйвер MySQL выдал другое непроверенное исключение, если вы это сделали; например, UnsupportedOperationException
. Однако стандартные JavBCoc JDBC не говорят, что должно происходить в этой ситуации. от поставщика зависит, что сделают его драйверы.)