Protože vezete celý databázovou tabulku uložit do paměti Java a testovat každý řádek ve smyčce while. Smyčku nepřerušíte, pokud je nalezena shoda, takže pokračuje v přepisování booleovského výsledku až do posledního řádku.
To znamená, že opravdu nechcete provádět srovnání v Javě. Stačí použít SQL WHERE
doložka
. To je moc efektivnější a skutečně úkol, který má DB dělat. Nesnažte se převzít práci DB v Javě, bude to jen neefektivní.
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;
}
Vidíte, že jsem provedl několik vylepšení:
- Použijte readystatement.
- Nepoužívejte equalsignorcase. Heslo „FooBar“ NESMÍ být stejné jako heslo „foobar“.
- Jemně získávejte a uzavírejte zdroje ve stejném rozsahu, abyste zabránili úniku.
- Mějte to v nezávislé a opakovaně použitelné nestatické metodě DAO.
Chcete-li se dozvědět více o správném používání JDBC, můžete najít toto základní návod užitečné.