Java 查询返回(rs.next()==false)。已填充表,已连接数据库

Java 查询返回(rs.next()==false)。已填充表,已连接数据库,java,mysql,database-connection,Java,Mysql,Database Connection,我正在尝试为连接到MYSQL的图书馆管理系统编写一个登录和连接函数。当我试图从数据库中检索personnummer和password时,它返回rs.Next==false。该表已填充,查询将返回数据库连接。谁能帮我找出我做错了什么?谢谢 public class main { public static void login() { //UI layer has been removed loginBu

我正在尝试为连接到MYSQL的图书馆管理系统编写一个登录和连接函数。当我试图从数据库中检索personnummer和password时,它返回rs.Next==false。该表已填充,查询将返回数据库连接。谁能帮我找出我做错了什么?谢谢

  public class main {

    public static void login() {                    

         //UI layer has been removed 

        loginButton.addActionListener(new ActionListener(){  

            public void actionPerformed(ActionEvent e){ 
                String personnummer = F_personnummer.getText();                      
                char[] password = F_password.getPassword();                         

                if(personnummer.equals("")){                                                             
                   JOptionPane.showMessageDialog(null,"Please enter personnummer (YYMMDDXXXX)");    
                } else if (password.equals("")){                                        
                    JOptionPane.showMessageDialog(null,"Please enter password"); 
                } else {                                             
                    try {                                                                                    
                        Connection connection=connect(); 
                        Statement stmt = connection.createStatement();  
                        stmt.executeUpdate("USE library");              

                        PreparedStatement loginQuery = connection.prepareStatement("SELECT * FROM library.users WHERE personnummer = " + "'" + personnummer + "'" + " AND password ='" + password + "'", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

                        ResultSet rs = loginQuery.executeQuery();

                        if(rs.next()==false) {
                              JOptionPane.showMessageDialog(null,                                                       
                        } else {
                              jframe.dispose();
                              rs.beforeFirst();
                              while(rs.next()) {                                                                                                                     
                                    if(personnummer.equals("admin") & password.equals("admin")) {
                                         adminMenu();                                                               
                                    } else {
                                         userMenu(personnummer);                                                                                     
                                    } 
                              }     // end while ()
                        }           // end else ()
                    }               // end try ()                               

                    catch (Exception exception) { 
                         exception.printStackTrace();
                    }       
                }       
            }               
        });                 

          // UI layer has been removed 
    }   

    public static Connection connect() throws Exception{
        try{
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/library?useTimezone=true&serverTimezone=UTC";
            String username = "root";
            String password = "root";
            Class.forName(driver);

            Connection connection = DriverManager.getConnection(url,username,password);
            System.out.println("Connected to database");
            return connection;
        }
            catch (Exception exception) {
                    System.out.println(exception);
            }

        return null;
    }
不安全代码 此代码是一个安全漏洞;例如,我可以输入这个作为密码:whatever';DROP TABLE library.users;--在登录表单上的密码框中输入密码后,数据库表将冒烟。解决的办法是使用准备好的报表;SQL查询必须始终是单个长字符串常量,不能将用户输入混入其中。您已经在其中准备好了语句-只需将所有字符串替换为问号:

PreparedStatement loginQuery = connection.prepareStatement("SELECT * FROM library.users WHERE personnummer = ? AND password = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
loginQuery.setString(1, personnummer);
loginQuery.setString(2, password);
不安全代码-重发 您应该使用bcrypt、scrypt、pbkdf2或其他一些密码哈希算法;这对你的用户来说是不安全的。你的笔记本电脑上有一个db的克隆,最后在街上,现在你所有用户的密码都在街上。用户倾向于重复使用密码。一般来说,整个行业,特别是像GDPR这样的各种法律,都把责任完全推到了你的脚上。包括巨额罚款。不要违反行业标准-使用密码哈希器

你真正的错误 您正在将“password”变量合并为字符串。这将调用变量上的toString。这个变量是一个char数组,它不像您想象的那样字符串化。您的查询结果为:选择*无论密码在哪里[C@1234567-试试看,打印那个字符串

结合修复
ps.setString2,新的Stringpassword。

你应该发布一个。如果你确定你的问题是关于JDBC的,请隔离代码的这一部分,删除UI层。我不确定问题是什么,我是一个完全的初学者,所以我不确定你们需要看到多少。直接将任何用户输入输入到SQL中通常是不好的做法语句。使用SQL注入可能会滥用它。请使用如图所示的setString方法