2012-02-14 10 views
0

私はシンプルなweb-appを使って、アイテムをメールボックスのようなデータベースから削除することができます。
これを行う正しい方法はありますか?データベースからレコードのリストを正しく削除する方法は?

私はこのように行うと思う:(DAOクラスで)

void delete(List<Long> ids){ 
    ..... 
    statement = connection.prepareStatement("DELETE FROM table WHERE id=?"); 
    for (Long id: ids){ 
     statement.setInt(1, id); 
     statement.executeUpdate(); 
    } 
    ...... 

またはこの:(サーブレットアクションクラスで)

DAO dao = new DAO(); 
for (Long id: ids){ 
    dao.delete(id); // in DAO simple method void delete(long id); 
    } 

は良いものではありません。あなたはそれを正しく行う方法を教えたり説明したりすることができますか?
UPDATE:誰かがレコードを1つずつ削除する方法を教えてもらえますか?

+1

エラーが発生しますか?またはアイテムは実際にデータベースから削除されませんか?どうした? – Randy

+0

@Randy、私はエラーはありませんが、SQLExceptionの場合に重大な問題を引き起こす可能性があるようにコードが書かれています – Ifozest

答えて

1

これは、1回の取引で削除されるかどうかによって大きく異なります。要求時に5つのレコードを削除する必要があり、3番目のレコードの削除が例外で失敗すると想像してください。最初の2つのレコードと最後の2つのレコードで正確にはどうなるでしょうか?それはあなたが最初にあなた自身を理解しなければならないビジネス要件です。

少なくとも、サーブレットで呼び出すDAO /サービスメソッドはこれに気を付けるべきではありません。 (いや、それは重複をListを含めることができないので)ので、同様にIDのSetを取ることができる必要があります:

Set<Long> ids = collectItSomehow(); 
someService.delete(ids); 

次に、実際のJDBCの実装では、あなたがステートメントのバッチを作成するためにPreparedStatement#addBatch()を使用することができますそれを実行するにはPreparedStatement#executeBatch()です。この回答には具体的な例がいくつかあります:Reusing a PreparedStatement multiple times

+0

ありがとう、これは私が探していたものです! – Ifozest

+0

ようこそ。 – BalusC

-1

レコードを1つずつ削除するか、複数のレコードを同時に選択したいですか?

+0

私は選択したすべてのレコードを削除したいと思います。最高に終わった。私はレコードを1つずつ削除すると思います(私のコードのように)。 – Ifozest

+1

これはコメントであり、答えではありません。 – home

0
for (Long id: ids){ 
     populateArray; 
    } 

上記のループから配列(tempArray)を作成してここに渡します。

statement = connection.prepareStatement("DELETE FROM table WHERE id in("+ tempArray+")"); 

注:これは、入力が正しく検証されない場合、SQLインジェクションを引き起こす可能性があります。

関連する問題