我的Web应用程序上有一张注册表。我想要的是,当用户提交表单时,应该进行验证以检查用户输入的电子邮件ID在数据库中是否已经存在。 因此,如果它存在,则应出现类似小吃店的消息,说明该电子邮件ID已经存在。如果这是一封新电子邮件,它将重定向到成功页面。
以下是我的checkData方法,我只是在检查在表单上输入电子邮件ID时是否存在,但是输出始终是“找不到值”。
public void checkData() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?autoReconnect=true&useSSL=FALSE", "root", "pwd");
st = con.createStatement();
String query1 = "select email from users where email='" +email99+ "'";
ResultSet rs = st.executeQuery(query1);
if(rs.next()) {
System.out.println("Success");
}
else {
System.out.println("Value not found");
}
rs.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
注意:-我主要关心的是电子邮件验证。
谢谢
答案 0 :(得分:0)
用于电子邮件验证
与获取操作相比,通常更新将花费更多时间,因此最好的方法是.. 首先,您必须检查此电子邮件ID是否存在任何行
String sql = "select email from users where email= ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "emailId");
ResultSet rs = prepStmt.executeQuery();
if (rs.next()) {
System.out.println("Row with email found");
} else {
// you can write update code here
}
答案 1 :(得分:0)
对于唯一电子邮件验证,有两种方法:
方法1: 第一个是执行选择查询并检查它,不建议将其作为解决方案。
PreparedStatement statement = connection.prepareStatement("select email from users where email= ?");
statement.setString(1, email99);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
System.out.println("Row with email found");
} else {
// you can write update code here
}
方法2: 在数据库级别上,使email列唯一。因此,无论何时插入新记录。 DB负责检查唯一的电子邮件地址并引发错误。使用该错误将其显示在前端。
欢呼!
答案 2 :(得分:0)
方法1:
最简单的方法是在列电子邮件中使用唯一索引。
您不能使用先查找电子邮件然后插入电子邮件的解决方案。假设有两个用户提交电子邮件some@email.com。而且您的数据库中没有电子邮件。
两个用户都将得到res.next()
的错误,并且您将在同一行中向数据库插入两行。
如果使用唯一索引,则如果已经有电子邮件,则将获得Exception。您可以捕获异常并返回“重复电子邮件”消息。 请参阅问题catch duplicate exception
如果使用Mysql,也许可以使用ON DUPLICATE KEY。
方法2: 还有一个更复杂的解决方案。
如果您不能使用唯一索引,那么可以考虑一下。
您可以使用锁。如果在分布式系统上工作,则应使用分布式锁。您应该锁定电子邮件。如果线程获得了锁定,则可以检查是否有目标电子邮件,然后将其插入数据库。
但是,如果您的系统仅在一个JVM上运行,则可以尝试:
syschronized(email.intern()) {
// check the email whether exists
// if not, insert it.
}
在这种情况下,您将遭受大型String池的困扰,这会影响GC暂停并浪费内存。
实际上,您可以使用双重检查来优化性能。看起来像
emailInDB = fetchEmailFromDB(email);
if (emailInDB == null) {
lock(email);
emailInDB = fetchEmailFromDB(email);
if(emailInDB == null) {
insertIntoDB(email)
} else {
return "the email already exists";
}
} else {
return "the email already exists";
}