Java - 如何检查MySQL表中是否已存在用户名

时间:2013-04-07 15:54:51

标签: java mysql database

我想检查username表中是否已存在database

Java代码:

if (e.getSource() == jButton2)
{
  U = jTextField1.getText();
  if (jTextField1.getText().trim().equals(""))
  {
    JOptionPane.showMessageDialog(this, "Please Write Username !");
  } 
  else if (jPasswordField1.getText().equals(""))
  {
    JOptionPane.showMessageDialog(this, "Please Write Password !");
  } 
  else
  {
    try {
      String Driver = "com.mysql.jdbc.Driver"; 
      String URL = "jdbc:mysql://localhost:3306/LoginForm"; 
      Class.forName(Driver); 
      Connection Conn = DriverManager.getConnection(URL, "root", "12345");
      Statement S = Conn.createStatement();
      ResultSet RS = S.executeQuery(
          "SELECT * FROM login where username ='" + U + 
          "' and Password ='" + jPasswordField1.getText() + "'");

      while (RS.next()) {
        String Username = RS.getString("Username");
        String Password = RS.getString("Password");
        String Admin = RS.getString("Admin");

        if (Username.equals(U) & Password.equals(jPasswordField1.getText()) &
          Admin.equals("0")) 
        {

          JOptionPane.showMessageDialog(this, "Logged In Successfully !");
          this.dispose();
          NormalUsers NU = new NormalUsers();
          break;

        } 
        else if (Username.equals(U) & 
          Password.equals(jPasswordField1.getText()) & Admin.equals("1"))
        {

          JOptionPane.showMessageDialog(this, 
            "Logged In Successfully , Opening Administration Panel !");

          this.dispose();
          AdminPanel AP = new AdminPanel();
          break;
        }
        else 
        {
          JOptionPane.showMessageDialog(this, "Invalid Username Or Password!");
        }
      }
    } 
    catch (SQLException | ClassNotFoundException ex)
    {
    }
  }
}

问题是:

  • 如果database中没有行,则表示没有错误消息:Invalid Username or Password
  • 当我手动执行SQL查询时:SELECT * From Login我看到该行存在,但由于我对password进行了过滤,因此无法进入while loop

我应该如何使用java来检查MySQL表中是否存在用户名?

5 个答案:

答案 0 :(得分:6)

对于此查询类型,您不需要遍历ResultSet。

您正在尝试找到一条确定的记录。你不会有两个具有相同用户名/密码的记录(我假设登录表的主键是用户名),所以只需if(rs.next())即可。如果存在,请验证以确定它是否为管理员。

此外,在查询中,您已经暗示该记录必须具有指定的用户名和密码,一旦返回结果集,则无需对其进行测试。

只测试用户类型,如果是管理员,则显示相应的消息,否则,执行正确的操作。

如果未满足rs.next(),则该用户不存在,因此在else块中,您可以显示有关未找到或无效的用户的错误消息。

答案 1 :(得分:5)

您需要处理的是MySQL查询。我认为带有WHERE子句的查询就是你要找的。

此外,您可能希望将该代码放在单独的类中,以防止烹饪一些spaghetti code

以下链接是与php语言相关的答案,但您需要查看的是MYSQL query和逻辑:Check If Username Exists

尝试这样的事情:

public String login(String uname, String password) throws Exception{

    String status=null;
    ConnectionHandler handler=new ConnectionHandler(); //class for connection
    Connection con=handler.createConnection();
    Statement stmt=con.createStatement();
    String query="select * from loginTable where username=" +
      "\""+uname+"\""+";";  //get username

    ResultSet rs=stmt.executeQuery(query); 
    String checkUser=rs.getString(1);
    String checkPass=rs.getString(2);
    if(checkUser.equals(uname) && checkPass.equals(password)){
        status="True";
    }
    else{
        status="False";
    }
    con.close();
    return status;
}

使用此status字符串,我确定用户名是否有效。让SQL做繁重的工作(就像它设计的那样),而不是用java自己编写。

答案 2 :(得分:2)

你可以SELECT COUNT(*) AS total FROM login where username ... 然后是resultSet.getInt("total")。如果用户已存在的总数大于0。 我也会使用PreparedStatement,因为它不太容易受到sql注入攻击。 看一下这个https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java。 sql count的例子......

ResultSet RS = S.executeQuery("SELECT COUNT(*) AS total FROM login where username ='" + U + "' and Password ='" + jPasswordField1.getText() + "'");
        while (RS.next()) {
            if( RS.getInt("total") > 0 ) {
                // user already exists
            } else {
                // user does not exist
            }
        }

答案 3 :(得分:2)

假设只返回一行,您可以用if语句替换while循环。执行查询后,您也无需检查用户名和密码,因为这是由where子句处理的。因此,您的查询可以修改为:

PreparedStatement prest = Conn.prepareStatement("SELECT Admin FROM login WHERE username = ? and Password = ?");
prest.setString(1, U);
prest.setString(2, jPasswordField1.getText());

然后使用if语句处理它:

if (rs.next()) {
  //Process user level (Normal or admin)
} else {
  //Incorrect login details
}

答案 4 :(得分:0)

我是Java的新手,但我认为你应该检查一下jPasswordField,如果它是JTextBox没有问题但是如果是JPasswordField那么getText()会返回byte[]非字符串,您需要先将byte[]转换为string