2011-05-12 154 views
0

我有一个问题,我有一个系统来添加用户,我必须检查,如果这个用户之前存在,这样我不会再添加他,我从数据库检索所有名称到arraylist.I首先检查如果数组列表是空的,这样我可以添加用户否则,如果他的存在与否 这里是代码,他将检查插入数据库

if(names.size() == 0){ 
     dbstatement.executeUpdate(" 
     insert into users (user_name,user_password,user_type) 
     values ('" + username + "','" + userpassword + "','" + type + "')"); 
     JOptionPane.showMessageDialog(rootPane, "user added successfully"); 
    } 
    else{     
     for (int i = 0; i < names.size(); i++) { 
      if (username.equals(names.get(i))) { 
       JOptionPane.showMessageDialog(rootPane, "Sorry, this name already exist"); 
       break; 
      } 
     } 
     dbstatement.executeUpdate 
     ("insert into users(user_name,user_password,user_type) 
     values ('" + username + "','" + userpassword + "','" + type + "')"); 
    } 

的问题是,当该程序发现了一个名字存在之前,他告诉我并添加他,我知道这个问题的原因,我想知道在哪里,但如果在里面的for循环,我想他告诉我用户存在只是不要再添加它

+0

我知道你没有指定这个,但考虑你是否需要['upsert'](http://en.wikipedia.org/wiki/Upsert)。 – onedaywhen

回答

1

只需使用SQL WHERE子句查看用户名是否存在。绝对不需要将整个数据库表复制到Java内存中。

preparedStatement = connection.prepareStatement("SELECT id FROM users WHERE user_name = ?"); 
preparedStatement.setString(1, username); 
resultSet = preparedStatement.executeQuery(); 
boolean exist = resultSet.next(); 

总结这就像boolean exist(String username)的方法,并重新安排你的代码流程如下:

if (exist(username)) { 
    // Show warning message. 
} else { 
    // Insert into DB. 
} 

注意PreparedStatement是被用来代替Statement。这可以防止你的代码从SQL injection attacks

0
if(names.size() == 0){ 
    dbstatement.executeUpdate(" 
    insert into users (user_name,user_password,user_type) 
    values ('" + username + "','" + userpassword + "','" + type + "')"); 
    JOptionPane.showMessageDialog(rootPane, "user added successfully"); 
} 
else{ 
    if (names.contains(username)) {     
      JOptionPane.showMessageDialog(rootPane, "Sorry, this name already exist"); 
    } 
    else { 
      dbstatement.executeUpdate 
      ("insert into users(user_name,user_password,user_type) 
        values ('" + username + "','" + userpassword + "','" + type + "')"); 
    } 
} 
1

只需调用数据库添加每个名称即可。

让sql尝试插入名称。它会插入或抛出密钥违例(假设你对该名称有一个唯一的约束)。

如果它引发密钥违规,则知道该名称已存在于数据库中。

如果它没有抛出错误,则插入名称。

读/决定/写风格处理不是做这项工作的方式。当另一个进程在读和写之间的时间插入一个新名称时,它仍然可能有问题。这意味着您仍然必须检查重要的违规行为。如果你必须检查重要的违规行为,那么你可能会在第一时间做对,并尝试插入所有的名字。

+0

+1正确的方法。如果OP的方法得到了扩展,他们最终将复制'前端'代码中的所有数据库约束,从而增加了在该过程中引入错误的风险(接近确定性)。 – onedaywhen