ホームページ >データベース >mysql チュートリアル >Java プリペアド ステートメントで「statement.executeQuery(searchperson);」によって SQL 構文エラーが発生するのはなぜですか?

Java プリペアド ステートメントで「statement.executeQuery(searchperson);」によって SQL 構文エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-11 15:22:41577ブラウズ

Why Does `statement.executeQuery(searchPerson);` Cause a SQL Syntax Error in Java Prepared Statements?

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 文字列は、surnamename のプレースホルダーを使用して SQL クエリを正しく定義します。 ただし、searchPersonstatement.executeQuery() に直接渡すとエラーの原因になります。 executeQuery() は、準備されたステートメントがすでにパラメータとともに設定されていることを想定しています。 SQL 文字列をパラメータとして受け入れません。

正しい実装:

解決策は、クエリを実行するにパラメータを正しくバインドすることです。 executeQuery() メソッドは、パラメーターのバインド後に引数なしで呼び出す必要があります。 修正されたコードは次のようになります (surnameValuenameValue が実際の値を保持していると仮定します):

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。