1

我想检查一个表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 表中?

4

5 回答 5

6

特别是对于这种查询类型,您不需要遍历 ResultSet。

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

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

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

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

于 2013-04-07T16:07:32.657 回答
5

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

此外,您可能希望将该代码放在一个单独的类中,以防止烹饪一些意大利面条代码

下面的链接是一个与php语言相关的答案,但你需要看的是MYSQL query逻辑: 检查用户名是否存在

尝试这样的事情:

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.lang. 编写代码。

于 2013-04-07T16:01:31.353 回答
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计数示例...

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
            }
        }
于 2013-04-07T16:03:18.240 回答
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
}
于 2013-04-07T16:23:42.833 回答
0

我是 Java 新手,但我认为你应该检查你的jPasswordField,如果JTextBox没有问题,但如果是,JPasswordFieldgetText()返回一个byte[]非字符串,你需要先转换byte[]string

于 2013-06-15T16:46:41.287 回答