2010-06-23 66 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