JDBC总是测试MySQL表的最后一行?
我有一个Manager类,它可以在SQL表中保存数据,也可以从SQL表中获取结果并测试这些数据。当我运行程序时,会显示一帧获取ID和密码,如果它们是正确的,另一帧将会显示。但我不知道为什么它只是测试SQL表的最后一行? 我的意思是,如果我将这些文本字段设置为除了最后一行之外的其他ID和密码。它将显示数据错误(我之前为错误的数据设置了它)
经理class:
public static boolean Test(String userName, String password) { boolean bool = false; Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rst = null; rst = stmt.executeQuery("SELECT yahooId , password FROM clienttable"); while (rst.next()) { if (rst.getString(1).equalsIgnoreCase(userName) && rst.getString(2).equalsIgnoreCase(password)) { bool = true; } else { bool = false; } } } catch (SQLException ex) { Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); } return bool; }
我的按钮在框架中执行操作,获取ID和密码并测试它:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { submit(); } catch (ConnectException ex) { JOptionPane.showMessageDialog(this, "You coudn't connect to the server successfully,try it again", "Sign_In Problem", JOptionPane.OK_OPTION); } clear(); } private void submit() throws ConnectException { String id = idField.getText(); char[] pass1 = passField.getPassword(); String pass = new String(pass1); if (id.equals("") || pass.equals("")) { Toolkit.getDefaultToolkit().beep(); JOptionPane.showMessageDialog(this, "You should enter an ID and password", "Sign_In Problem", JOptionPane.OK_OPTION); return; } else { boolean b = Manager.Test(id, pass); client.setCurrentName(id); if (b == true) { this.setVisible(false); ListFrame frame = new ListFrame(client); frame.setVisible(true); } else { JOptionPane.showMessageDialog(this, "You have entered wrong datas,try it again", "Sign_In Problem", JOptionPane.OK_OPTION); return; } } }
编辑:
我编辑了我的经理课程(测试方法),但它仍然像过去一样!
public static boolean Test(String userName, String password) { boolean bool = false; PreparedStatement stmt = null; ResultSet resultSet = null; try { stmt = conn.prepareStatement("SELECT id FROM clienttable WHERE yahooId = ? AND password = ?"); stmt.setString(1, userName); stmt.setString(2, password); resultSet = stmt.executeQuery(); bool = resultSet.next(); } catch (SQLException ex) { Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); } finally { try { resultSet.close(); stmt.close(); conn.close(); } catch (SQLException ex) { Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); } } return bool; }
因为您将整个数据库表拖入Java的内存并测试while循环中的每一行。 如果找到匹配项,则不会中断循环,以便它继续覆盖布尔结果,直到最后一行。
也就是说,你真的不想在Java中进行比较。 只需使用SQL WHERE
子句即可 。 这更有效率,而且确实是DB应该做的任务。 不要试图接管DB在Java中的工作,它只会效率低下。
public boolean exists(String username, String password) throws SQLException { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; boolean exists = false; try { connection = database.getConnection(); preparedStatement = connection.prepareStatement("SELECT id FROM client WHERE username = ? AND password = ?"); preparedStatement.setString(1, username); preparedStatement.setString(2, password); resultSet = preparedStatement.executeQuery(); exists = resultSet.next(); } finally { close(resultSet); close(preparedStatement); close(connection); } return exists; }
你看我做了一些改进:
- 使用preparedstatement。
- 不要使用equalignorecase。 密码“FooBar”不应与“foobar”相同。
- 轻轻获取并关闭相同范围内的资源以避免泄漏。
- 在独立且可重复使用的非静态DAO方法中使用它。
要了解有关使用JDBC的更多信息,您可能会发现这个基本教程很有用。
简单的答案是你的while循环应该在你找到匹配时终止,所以它应该是:
while (rst.next() && bool == false) { if (rst.getString(1).equalsIgnoreCase(userName) && rst.getString(2).equalsIgnoreCase(password)) { bool = true; } }
请注意,仅选择与您的用户ID和密码匹配的行会更有效,这些行与以下内容相符:(请注意,error handling留给读者练习)
PreparedStatement stmt; stmt = conn.prepareStatement(“SELECT yahooId,password FROM clienttable WHERE yahooId =?”); stmt.setString(1,“userName”);
ResultSet rst = null; rst = stmt.executeQuery();
if(rs!= null && rs.getString(“password”)。equals(password)){bool = true; }
- Java豆:我错过了什么?
- java.awt.Color.getColor(String colorName)如何工作?
- Mockito – Mock没有被注入其中一个测试用例
- 使用apache httpClient客户端将发布数据发送到https而不使用ssl证书validation
- HttpClient登录,搜索并获取XML内容
- 使用guice作为注入类的框架,正确的初始化方法?
- 如何使用SAX XML Schema Validator的validation消息进行内部化?
- 如何将JasperPrint直接打印到打印机?
- java rmi身份validation和安全性。 exportObject使它公开?