【问题标题】:Unable to test username/password with JDBC query无法使用 JDBC 查询测试用户名/密码
【发布时间】:2014-09-18 14:35:23
【问题描述】:

我正在尝试制作一个连接到 SQL 数据库的登录表单。这是我的代码:

private void cmd_loginActionPerformed(java.awt.event.ActionEvent evt) {                                          
    String sql="Selet * from inventor1";
    try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn= (Connection); 
             DriverManager.getConnection("jdbc:mysql://localhost:3306/inventor","root","root");
        Statement stmt=conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        String user=t1.getText();
        String pass=new String(t2.getText());
        while(rs.next()){
            String username=rs.getString("username");
            String password=rs.getString("password");
            if(user.equals("username") && pass.equals("password")){
                new Mainmenu().setVisible(true); 
            }
        }
    }catch(Exception e){
        JOptionPane.showMessageDialog(this, "password and username not match");
    }
}

但是,用户名和密码似乎永远不会匹配,即使我输入的内容与数据库中的内容匹配。为什么用户名和密码永远不匹配?

【问题讨论】:

  • 只需打印e.printStackTrace() 即可查看您遇到的任何异常。您正在跳过它(这是一种不好的做法)
  • 您的真实程序是否在sql 字符串中显示“selet”?我认为那应该是“选择”。
  • 为什么要选择数据库中的所有行并通读所有行以找到匹配项?那不是很有效。相反,您应该使用带有 where 子句的 select 语句来匹配您的用户 ID 和密码。您可以先阅读JDBC Database Access 上的一些 SQL 基础教程。
  • 如果我们讨论的是存储登录信息的最佳做法,请不要忘记散列密码!

标签: java netbeans jdbc


【解决方案1】:

首先是错别字(必须)

  • Selet * from inventor1 应该是 Select 而不是 Selet
  • Connection conn= (Connection); <---- Remove ;

现在你可能会得到Exception,但你正在通过使用来吞下它

JOptionPane.showMessageDialog(this, "password and username not match");

所以我认为这个问题的原因是你的查询因为Selet而每次都抛出SQLException

其次,您正在使用* 检索所有数据

【讨论】:

    【解决方案2】:

    这里多了一个分号

    Connection conn= (Connection); 
        DriverManager.getConnection("jdbc:mysql://localhost:3306/inventor","root","root");
    

    我想你想要

    Connection conn= (Connection) 
        DriverManager.getConnection("jdbc:mysql://localhost:3306/inventor","root","root");
    

    【讨论】:

      【解决方案3】:

      问题不在于密码不匹配(如果这是问题所在,代码将永远不会使主菜单可见,但不会引发错误)。相反,会引发错误(可能是由于与数据库的连接出现问题)。需要更多信息来诊断确切的问题,因此对于初学者,请尝试替换:

      catch(Exception e){
          JOptionPane.showMessageDialog(this, "password and username not match");
      }
      

      用这个:

      catch(Exception e){
          e.printStackTrace();
          JOptionPane.showMessageDialog(this, "An error occurred, see log for details.");
      }
      

      一般来说,正是因为这个问题,简单地捕获Exception 然后忽略它是不好的做法,就像您的代码段所做的那样。收到错误消息后,您可以自行研究问题,如果仍然无法解决问题,请在此处发布消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-16
        • 2016-08-22
        • 2019-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        相关资源
        最近更新 更多