Eftersom du drar hela databastabell ner i Javas minne och testa varje rad i en while-loop. Du bryter inte loopen om en matchning hittas så att den fortsätter att skriva över det booleska resultatet förrän med den sista raden.
Som sagt, du vill verkligen inte göra jämförelsen i Java. Använd bara SQL WHERE
klausul
. Det är mycket effektivare och verkligen den uppgift en DB är tänkt att göra. Försök inte ta över DB:s arbete i Java, det kommer bara att bli ineffektivt.
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;
}
Du ser att jag gjorde några förbättringar:
- Använd preparerat uttalande.
- Använd inte equalsignorecase. Lösenordet "FooBar" bör INTE vara detsamma som "foobar".
- Skaffa och stäng försiktigt resurser i samma omfattning för att undvika läckage.
- Ha den i en oberoende och återanvändbar icke-statisk DAO-metod.
För att lära dig mer om hur du använder JDBC på rätt sätt kan du hitta detta grundläggande handledning användbar.