2016-12-03 92 views
-2

我有一個實現動作監聽器的註冊對話框。如果用戶輸入一個名稱並且它已經存在,我想在控制檯上打印一條消息。如果用戶名不存在,MySQL應該將其添加到數據庫中。不幸的是這個代碼將無法正常工作:檢查用戶名是否存在於MySQL Java中

private void regButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    if(!userBox.getText().equals("")) 
    { 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/genx", "root", "Warlock1989"); 
      Statement stmt = con.createStatement(); 
      String query = "SELECT name FROM accounts"; 
      ResultSet rs = stmt.executeQuery(query); 
      while(rs.next()) 
      { 
       String uname = rs.getString("name"); 
       if(!uname.equals(userBox.getText())) 
       { 
        PreparedStatement pstmt = con.prepareStatement("INSERT INTO accounts(name) VALUES(?)"); 
        pstmt.setString(1, userBox.getText()); 
        pstmt.executeUpdate(); 
        System.out.println("Username " + userBox.getText() + " has been registered."); 
       } 
       else 
       { 
        System.out.println("Username " + userBox.getText() + " already exists."); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
+0

「不起作用」是什麼意思? – Tunaki

+0

打印堆棧跟蹤 – Shriram

+0

沒有堆棧跟蹤。完全沒有任何反應。它不會調用if,else或catch。 –

回答

1

您當前的辦法從數據庫中加載的所有記錄,並試圖找出這將導致內存異常,如果數據庫包含大量記錄的用戶。所以, 不要從數據庫獲取所有記錄,而只需運行使用where name=?檢查用戶數據庫中已存在的查詢,如下圖所示:

PreparedStatement pstmt1 = null; 
PreparedStatement pstmt2 = null; 
ResultSet rs = null; 
try { 

    String userInput = userBox.getText(); 

    String query = "SELECT name FROM accounts where name=?"; 
    pstmt1 = con.preparedStatement(query); 
    pstmt1.setString(1, userInput); 

    rs = pstmt1.executeQuery(); 

    if(rs.next()) { 
      pstmt2 = con.prepareStatement("INSERT INTO accounts(name) VALUES(?)"); 
      pstmt2.setString(1, userInput); 
      pstmt2.executeUpdate(); 
      System.out.println("Username " + userInput + " has been registered."); 
    } else { 
      System.out.println("Username " + userInput + " already exists."); 
    } 

} catch(SQLException sqlexe) { 
    //add logging 
} finally { 
    if(pstmt1 != null) 
     pstmt1.close(); 
    if(pstmt2 != null) 
     pstmt2.close(); 
    if(rs != null) 
     rs.close(); 
} 

您當前的代碼不釋放resultsset & preparedstatement對象,所以確保你在finally塊中釋放資源。