7

PreparedStatementパフォーマンスを向上させるために、繰り返し実行される Statement オブジェクトをオブジェクトに置き換えることを計画しています。MySQL 関数now()や文字列変数などの引数を使用しています。

私が見たほとんどのクエリには、クエリで使用される引数としてPreparedStatement定数値 ( 10、および などの文字列) が含まれていました。や変数などの関数を引数として使用するにはどうすればよいですか? 実際の値の代わりにクエリで sを使用する必要がありますか? 私はかなり当惑しています。"New York"?now()?

4

5 に答える 5

13

ユーザー入力からの変数がある場合は、? を使用することが不可欠です。文字列を連結するのではなく。ユーザーが悪意を持って文字列を入力する可能性があり、その文字列を直接 SQL にドロップすると、意図しないコマンドが実行される可能性があります。

私はこれが使い古されていることを理解していますが、それは完全にそれを言っています:

リトル ボビー テーブル

于 2009-01-07T03:25:42.117 に答える
11

変数がある場合は、「?」を使用します。

int temp = 75;
PreparedStatement pstmt = con.prepareStatement(
    "UPDATE test SET num = ?, due = now() ");
pstmt.setInt(1, temp); 
pstmt.executeUpdate():

次のような sql ステートメントを生成します。

UPDATE test SET num = 75, due = now();
于 2009-01-07T02:58:08.647 に答える
0

PreparedStatement でプレースホルダーを使用する必要はありません。何かのようなもの:

PreparedStatement stmt = con.prepareStatement("select sysdate from dual");

うまくいくでしょう。ただし、プレースホルダーを使用して関数呼び出しをバインドすることはできません。次のようなものは、sysdate 関数の呼び出しには使用できません。

PreparedStatement stmt = con.prepareStatement("select ? from dual");
stmt.setSomethingOrOther(1, "sysdate");
于 2009-01-08T15:47:21.993 に答える
0

SQL サーバーの組み込み関数を呼び出す場合は、PreparedStatementを使用します。

SQL サーバーにロードされたストアド プロシージャを呼び出す場合は、CallableStatementを使用します。

渡す関数/プロシージャ パラメーターと受け取る関数の戻り値のプレースホルダーとして疑問符を使用します。

于 2009-01-11T02:45:00.330 に答える