Ponieważ ciągniesz całość tabelę bazy danych do pamięci Javy i testowanie co wiersz w pętli while. Nie przerywasz pętli, jeśli zostanie znalezione dopasowanie, tak że nadal nadpisuje wynik logiczny aż do ostatniego wiersza.
To powiedziawszy, naprawdę nie chcesz robić porównania w Javie. Wystarczy skorzystać z SQL WHERE
klauzula
. To dużo bardziej wydajne i naprawdę zadanie, które ma wykonać DB. Nie próbuj przejmować pracy bazy danych w Javie, będzie to tylko nieefektywne.
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;
}
Widzisz, że wprowadziłem kilka ulepszeń:
- Użyj przygotowanego oświadczenia.
- Nie używaj equalsignorecase. Hasło „FooBar” NIE powinno być takie samo jak „foobar”.
- Delikatnie pozyskuj i zamykaj zasoby w tym samym zakresie, aby uniknąć wycieku.
- Miej to w niezależnej i wielokrotnego użytku niestatycznej metodzie DAO.
Aby dowiedzieć się więcej o używaniu JDBC we właściwy sposób, możesz znaleźć ten podstawowy samouczek przydatne.