2012-02-14 85 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注入。