Java 如何检查数据库中的重复条目?
我需要应用检查,以便用户无法使用数据库中已存在的电子邮件id进行注册。对数据库表中的相关列设置唯一约束。例如(MySQL):Java 如何检查数据库中的重复条目?,java,database,jdbc,Java,Database,Jdbc,我需要应用检查,以便用户无法使用数据库中已存在的电子邮件id进行注册。对数据库表中的相关列设置唯一约束。例如(MySQL): 编辑-如果在上面的注释中,电子邮件字段已经是主键,则不需要此字段,因为主键根据定义是唯一的。然后,在Java中,如果插入一个主键已经存在的记录,或者您可以执行一个SELECT。。。其中Email=?在您尝试插入之前,查看是否已经有该电子邮件地址的记录。在电子邮件列上设置一个约束,或在插入之前选择。可能类似于此DAO方法: public boolean isDuplicat
编辑-如果在上面的注释中,电子邮件字段已经是主键,则不需要此字段,因为主键根据定义是唯一的。然后,在Java中,如果插入一个主键已经存在的记录,或者您可以执行一个
SELECT。。。其中Email=?
在您尝试插入之前,查看是否已经有该电子邮件地址的记录。在电子邮件列上设置一个约束,或在插入之前选择。可能类似于此DAO方法:
public boolean isDuplicateEntry(String email) {
Session session = getSession();
try {
User user = (User) session.get(User.class, email);
session.close();
return (null != user);
} catch (RuntimeException e) {
log.error("get failed", e);
session.close();
throw e;
}
}
你可以:
- 使电子邮件字段唯一,尝试插入并捕获异常
- 在每次插入之前进行选择
SELECT
的ResultSet#next()
应返回false
。然后执行插入操作INSERT
操作,并确定任何捕获的SQLException
是否以23
开头,根据。也就是说,它可能是由比“仅仅”违反约束更多的因素造成的。您不应该将每个SQLException
作为约束冲突来处理
public static boolean isConstraintViolation(SQLException e) {
return e.getSQLState().startsWith("23");
}
也就是说,您通常不希望在电子邮件字段上设置PK。它们可能会发生变化。而是使用DB管理的自动生成PK(MySQL:
BIGINT UNSIGNED AUTO_INCREMENT
,Oracle/PostgreSQL:SERIAL
,SQLServer:IDENTITY
),并为电子邮件字段提供一个唯一的
键。不清楚:您是用Java连接到MySQL的吗?只需在数据库中选择该电子邮件,看看它是否在。你可能想知道你使用的是什么数据库等等。是的,我正在使用我的sql数据库。我已经将emailid设置为主键+1-“或在插入之前选择”。。。在同一笔交易中+1-尽可能(或实际)在数据库级别强制执行数据约束。我建议将session.close()放在finally块中。这并不是一个很大的问题,但这是一个经典的例子,在我看来,您希望使用finally块。@tkeE2036您是对的,@bhavna raghuvanshi您应该将它放在DAO类所在的位置。我希望第二个可以避免对数据库的两次调用。同意你关于电子邮件领域的看法。不是一个很好的主键候选者。@HLGEM:对索引字段的查询很便宜。创建异常代价高昂。我不确定。在微优化之前配置文件,或者根本不进行微优化;)异常应该很少命中,所以它可能会更昂贵,一次命中数据库,二次命中,每次插入都会发生。因此,从长远来看,它将更加昂贵。但是当你面对多重选择时,你是对的,这是一个好主意。
public static boolean isConstraintViolation(SQLException e) {
return e.getSQLState().startsWith("23");
}