2010-06-23 119 views
0

我需要应用检查,以便用户无法使用数据库中已存在的电子邮件ID进行注册。如何检查数据库中的重复条目?

+0

目前还不清楚:你的接口在Java中的MySQL? – Jack 2010-06-23 13:06:16

+3

只需在数据库中选择该电子邮件并查看它是否在英寸。您可能想知道您使用的数据库等等。 – hamax 2010-06-23 13:06:55

+0

是的,我正在使用我的sql数据库。 我也在田间EMAILID作为主键 – 2010-06-23 13:09:51

回答

1

大概是这样的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; 
     } 
    } 
+0

我会建议把session.close()放在finally块中。这并不是一个巨大的交易,但这是一个经典的例子,你可能想在我看来使用finally块。 – 2010-06-23 13:14:37

+1

我应该在哪里放这个代码? – 2010-06-23 13:18:52

+0

@ tkeE2036你是对的,@bhavna raghuvanshi你应该把它放在您的DAO类 – ant 2010-06-23 13:40:09

1

在数据库表中的相关列上添加一个唯一约束。例如(MySQL的):

ALTER TABLE Users ADD UNIQUE (Email) 

编辑 - 如果你在上面评论写电子邮件领域已经是一个主键,那么你不需要这个,因为主键被定义独特。然后在Java中,您可以捕获您获得的SQLException,如果您要插入带有已存在主键的记录,或者您可以在尝试插入之前执行SELECT ... WHERE Email=?以查看是否已有包含该电子邮件的记录地址。

9

在电子邮件列上添加约束,或在插入前选择。

+3

+1 - *“或插入前选择” * ...在同一个事务! – 2010-06-23 13:11:40

+0

+1 - 尽可能(或实际)在数据库级别实施数据约束。 – 2010-06-23 13:57:29

0

您可以:

  • 使电子邮件领域独树一帜,尝试插入和捕获异常

  • ma科每前选择插入
3

确实有基本上有两种方式来实现这一目标:

  1. 测试是否记录插入,同一事务内部存在之前。 SELECTResultSet#next()应返回false。然后做INSERT

  2. 只是做INSERT反正确定的任何SQLException#getSQLState()逮住SQLException开始与23这是一个约束违规按该SQL specification。它可能是由多种因素造成的,而不仅仅是违反约束条件。你应该不处理每个SQLException作为违反约束。

    public static boolean isConstraintViolation(SQLException e) { 
        return e.getSQLState().startsWith("23"); 
    } 
    

我会选择第一种方式,因为它在语义上更正确。这实际上并不是一个特殊的情况。你即知道它可能会发生。但它可能潜在地失败,在交易不是同步(无意识地或优化性能)的交易量很大的并发环境中。您可能想要确定异常。


这就是说,你通常不希望把一个PK放在电子邮件字段中。他们即将发生变化。而是使用数据库管理的自动生成的PK(MySQL:BIGINT UNSIGNED AUTO_INCREMENT,Oracle/PostgreSQL:SERIAL,SQLServer:IDENTITY)并给电子邮件字段键入UNIQUE

+0

我宁愿第二,以避免两次调用数据库。同意你的电子邮件字段。不是主键的合适人选。 – HLGEM 2010-06-23 17:58:06

+0

@HLGEM:对索引字段的查询很便宜。创建一个异常很昂贵。我不确定。 microoptimizing之前简介或只是不microoptimize可言;) – BalusC 2010-06-23 18:00:58

+0

异常应该打很少,因此可以更贵,一重击数据库副二,情况与每一次插入。艾尔戈,从长远来看它会更昂贵。但是当你面对多种选择时你是对的,这是一个好主意。 – HLGEM 2010-06-23 18:31:00