2012-02-14 108 views
0

我做了一個簡單的網絡應用程序,用戶可以選擇項目的複選框將它們從數據庫中刪除(如郵件管理器)。
那麼,有沒有一個正確的方法來做到這一點?如何正確地從數據庫中刪除記錄列表?

我認爲做這樣的:(在DAO類)

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

或這樣的:(在servlet的動作類)

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

並不好。你告訴或解釋如何做對嗎?
更新:好的,有人能告訴我如何刪除記錄不是一個一個?

+1

你會得到錯誤嗎?或者這些項目實際上並沒有從數據庫中刪除?有什麼問題? – Randy 2012-02-14 14:50:28

+0

@Randy,我沒有任何錯誤,但代碼是這樣編寫的,以防出現SQLException可能導致嚴重問題 – Ifozest 2012-02-14 14:56:59

回答

1

這很大程度上取決於它們是否應該在單次交易中被刪除。想象一下,你需要在請求中刪除5條記錄,刪除第三條記錄失敗併產生異常。前兩條記錄和最後兩條記錄究竟應該發生什麼?這是你必須首先弄清楚自己的業務需求。

至少,您在servlet中調用的DAO/service方法不應該關心這個。它應該能夠採取ID的Set像這樣(不,不是一個List,因爲它可以包含重複):

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

然後,在實際的JDBC實現,你可以使用PreparedStatement#addBatch()創建一個批處理報表和PreparedStatement#executeBatch()來執行它。你可以在這個答案中找到一些具體的例子:Reusing a PreparedStatement multiple times

+0

謝謝,這正是我一直在尋找的! – Ifozest 2012-02-14 21:08:53

+0

不客氣。 – BalusC 2012-02-14 21:22:28

-1

想要一個一個刪除記錄或一次選擇多條記錄嗎?

+0

我不知道該說些什麼。)我想刪除所有選定的記錄,現在我問清楚這是怎麼回事做得最好。我想逐個刪除記錄(如我的代碼)不好。 – Ifozest 2012-02-14 14:54:14

+1

這是一條評論,而不是答案。 – home 2012-02-14 14:54:34

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

從上面的循環創建數組(tempArray)並將其傳遞到此處。

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

注意:如果輸入未正確驗證,可能會導致sql注入。