1

私はPreparedStatementを作成します。あなたの問題を解決していない答えを引数に渡す必要がある場合は、あなたの質問の部分を詳細に説明するように編集してください。 タイトルint値のPreparedStatementを作成する価値はありますか?

int値のPreparedStatementを作成する価値はありますか? SQLクエリですが、int引数を渡して実行後に​​終了する文を準備する価値はありますか?

void delete(int key, int orElse) throws SQLException 
{ 
    try(PreparedStatement pst = this.connection.prepareStatement(
     "DELETE FROM a_table WHERE the_int_primary_key=? OR random_int_field=?" 
    )) 
    { 
     pst.setInt(1, key); 
     pst.setInt(2, orElse); 
     pst.executeUpdate(); 
    } 
} 

この声明を準備する価値はありますか?とにかくセキュリティを強化する予定ですか?

通常の声明でこれを行うとどうなりますか?それはどんな方法でも危険ですか?それは少し速く実行されますか?

void delete(int key, int orElse) throws SQLException 
{ 
    try(Statement stm = this.connection.createStatement()) 
    { 
    stm.executeUpdate(
     "DELETE FROM a_table WHERE the_int_primary_key="+key+" OR random_int_field="+orElse 
    ); 
    } 
} 

編集:この質問はDo prepared statements slow down program conspicuously?ための複製されません :プリペアドステートメントを複数回再利用する

  • 他の質問の平野、私は一度だけ、それを使用することを計画し、ドキュメントが既にあることを指定します再利用が速いPreparedStatements
  • 私はSQLインジェクションについて心配していますが、SQLにプリミティブなintパラメータを挿入できるかどうかわかりません。マイクロスピードの向上はちょっとプラスだと、私はパフォーマンスのために頼んでいません。もう1つの質問は、スピードを上げたいだけで、文字列、日付、またはその他の非プリミティブ型を使用している可能性があります。 Javaのドキュメントから
+0

は常に準備文を使用するか、SQLインジェクション攻撃のリスクがあります –

+3

常にです。 **常に**。必ず 'PreparedStatement'を使用してください。例外なく。言い訳しない。 –

+0

[準備されたステートメントはプログラムを著しく遅くしますか?]の可能な複製はありますか?(http://stackoverflow.com/questions/3589961/do-prepared-statements-slow-down-program-conspicuously) – 4castle

答えて

7

SQL文がプリコンパイルし、PreparedStatementの オブジェクトに格納されています。このオブジェクトは、この ステートメントを効率的に複数回実行するために使用できます。

あなたの質問に答えるには:準備ができています。準備注射を使用することが重要です。注入注射(SQL注入など)から身を守る最善の方法です。通常の声明では、あなたが非常に独自の "良い" SQLパーサを作ったとしても、おそらくいくつかの攻撃から保護することはできません。

+0

は異なる問題だ理由を示すために、質問を編集しました...セキュリティに関する懸念は一切ありません。スピードの懸念と馬鹿の校正のみ。 – 4castle

+3

誰かが方法を見つけることができるということは、おそらく...誰が知っていますか?準備された陳述がそれに対して警戒する。車道にぶつかる危険性がないので、あなたが通りに来るまで安全ベルトを着用する必要はないと言っているようなものです。いいえ、できます。そして、それが誇る安全のためには、コストを最小限に抑える必要があります。準備されたステートメントの場合と同じこと –

+2

また、あなたがそれらを必要としているかどうかを質問するのは恐ろしい考えです。いつかあなたが何かを見過ごして間違ってしまうため、必然です。あなたがいつもそれらを使うならば、あなたはそのようなミスをすることはできません。 – James

1

代わりに「準備文を使用するのはより複雑ですか?」と尋ねます。プレーンなJDBCだけを使用すると、少し時間がかかります。だから、何も得られないことがある。したがって、リスク(SQLインジェクション)を取らず、プレーンな(準備ができていない)ステートメントを混ぜてはいけません。

もしそれがあまりにも冗長である場合は、より良い構文を提供するライブラリを探したり、

try (MyPreparedStatement pst = new MyPreparedStatement(connection, 
    "DELETE FROM a_table WHERE the_int_primary_key=? OR random_int_field=?" 
)) 
{ 
    pst.executeUpdate(1, 2); 
} 
関連する問題