晚上好。以下是我在数据库中添加项目的代码
String sql = "Insert into userinfo(firstname,lastname,contactNumber,email,address,username,password,accountType) value (?,?,?,?,?,?,?,?)";
String accountType = (String) jComboBoxAccType.getSelectedItem();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, jTextFieldFistName.getText());
ps.setString(2, jTextFieldLastName.getText());
ps.setString(3, jTextFieldContactNumber.getText());
ps.setString(4, jTextFieldEmail.getText());
ps.setString(5, jTextFieldAddress.getText());
ps.setString(6, jTextFieldUsername.getText());
ps.setString(7, jTextFieldPassword.getText());
ps.setString(8, accountType);
ps.execute();
在添加之前,我怎样才能检查是否已存在用户名和密码?
答案 0 :(得分:1)
通常,您希望数据库本身强制执行此类数据完整性规则。这可确保数据正确无误。您不希望在应用程序级别进行检查,因为这会引入竞争条件(两个插入基本上同时发生,其中两个插入都验证表没有重复,然后都插入相同的值)。
您可以使用唯一约束或唯一索引来保证唯一性(前者使用后者实现)。插入重复值时,这将生成错误。它很容易创建:
alter table userinfo add constraint unq_username_password unique (username, password);
也就是说,通常用户只有一个密码,因此约束只会出现在用户名上:
alter table userinfo add constraint unq_username unique (username);
答案 1 :(得分:0)
您需要类似此代码的内容
PreparedStatement ps=connection.prepareStatement("select 1 from userinfo where username=? and password=?");
ps.setString(1, jTextFieldUsername.getText());
ps.setString(2, jTextFieldPassword.getText());
ps.execute();
if (ps.getResultSet.next()) {
// So, user and password already in database
}
else {
// Insert value...
}
但是,对我来说,在将新用户添加到数据库期间检查现有的同一对(用户名,密码)并不是一个好主意。
答案 2 :(得分:0)
有三种不同的方法可以执行检查:
1)创建一个查询,搜索具有相同用户名和密码的记录是否存在,如:
SELECT COUNT(*) as exists FROM userinfo WHERE username = :username AND password = :password
或
SELECT username as exists FROM userinfo WHERE username =:username AND password =:password
因此,如果找到重复记录,则“exists”字段将返回不同于0或NULL的值。
2)只需为用户名和密码创建一个唯一索引,当您尝试插入重复记录时,将引发错误,因此您必须在“之间使用”try ... catch“语句ps.execute”。
3)添加一个子查询,检查是否存在重复值(参见:https://stackoverflow.com/a/3025332/1641558)
答案 3 :(得分:0)
您只应将查询更改为
Insert ignore into userinfo(firstname,lastname,contactNumber,email,address,username,password,accountType) value (?,?,?,?,?,?,?,?)