ホームページ >データベース >mysql チュートリアル >Java プリペアド ステートメントで「statement.executeQuery(searchperson);」によって SQL 構文エラーが発生するのはなぜですか?
Java プリペアド ステートメント: 「?」による SQL 構文エラーのトラブルシューティングプレースホルダー
Java のプリペアド ステートメントを使用すると、多くの場合、不適切なプレースホルダー (?
) の使用が原因で「SQL 構文エラー」メッセージが表示されます。 一般的なシナリオを調べてみましょう:
次の Java コード スニペットは、間違ったアプローチを示しています。
<code class="language-java">String searchPerson = "select * from persons where surname like ? and name like ?"; statement.executeQuery(searchPerson); </code>
searchPerson
文字列は、surname
と name
のプレースホルダーを使用して SQL クエリを正しく定義します。 ただし、searchPerson
を statement.executeQuery()
に直接渡すとエラーの原因になります。 executeQuery()
は、準備されたステートメントがすでにパラメータとともに設定されていることを想定しています。 SQL 文字列をパラメータとして受け入れません。
正しい実装:
解決策は、クエリを実行する前にパラメータを正しくバインドすることです。 executeQuery()
メソッドは、パラメーターのバインド後に引数なしで呼び出す必要があります。 修正されたコードは次のようになります (surnameValue
と nameValue
が実際の値を保持していると仮定します):
<code class="language-java">String searchPerson = "select * from persons where surname like ? and name like ?"; PreparedStatement statement = connection.prepareStatement(searchPerson); statement.setString(1, surnameValue); statement.setString(2, nameValue); ResultSet rs = statement.executeQuery(); // Execute without additional parameters // Process the ResultSet (rs) here</code>
この改訂されたコードは、最初に PreparedStatement
オブジェクトを作成し、次に setString()
を使用してパラメータ値を設定し、最後に executeQuery()
を使用して SQL 文字列を再度渡すことなくクエリを実行します。これにより、データベースがプレースホルダーを正しく解釈し、構文エラーを回避できるようになります。
以上がJava プリペアド ステートメントで「statement.executeQuery(searchperson);」によって SQL 構文エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。