2016-12-03 88 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块中释放资源。