【问题标题】:Checking if username exists in MySQL Java检查用户名是否存在于 MySQL Java 中
【发布时间】:2016-12-03 16:14:05
【问题描述】:

我有一个实现动作监听器的注册对话框。如果用户输入了一个名称并且它已经存在,我想在控制台上打印一条消息。如果用户名不存在,MySQL 应该将其添加到数据库中。不幸的是,这段代码不起作用:

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();
        }
    } 

【问题讨论】:

  • “行不通”是什么意思?
  • 打印你的堆栈跟踪
  • 没有堆栈跟踪。什么都没有发生。它不调用 if、else 或 catch。
  • 你的桌子是空的吗?因为这样 select 将不返回任何行,rs.next() 将返回 false...

标签: java mysql database


【解决方案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 块中释放资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多