我有一个问题,我有一个系统来添加用户,我必须检查此用户是否存在以便我不会再次添加他,我从数据库中检索所有名称到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 + "')");
}
问题是当程序在他告诉我并添加他之前发现名称存在时,我知道这个问题的原因所有我想知道在哪里但是if if for循环,我希望他告诉我用户只存在不再添加
答案 0 :(得分: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。
答案 1 :(得分:1)
只需使用要添加的每个名称调用数据库。
让sql尝试插入名称。它将插入或抛出密钥违规(假设您对名称有唯一约束)。
如果它违反了密钥,您就知道该名称已存在于数据库中。
如果没有抛出错误,则插入名称。
读取/决定/写入样式处理不是使其工作的方法。当另一个进程在读取和写入之间插入新名称时,它仍然会出现问题。这意味着您仍然必须检查密钥违规。如果你不得不检查密钥违规,你可以在第一时间做正确的尝试,并尝试插入所有名称。
答案 2 :(得分: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 + "')");
}
}