Fordi du trækker det hele databasetabel ned i Javas hukommelse og test hver række i en mens-løkke. Du bryder ikke løkken, hvis der findes et match, så det fortsætter med at overskrive det boolske resultat indtil med den sidste række.
Når det er sagt, vil du virkelig ikke lave sammenligningen i Java. Du skal bare bruge SQL WHERE
klausul
. Det er meget mere effektiv og virkelig den opgave, en DB skal udføre. Forsøg ikke at overtage DB's arbejde i Java, det bliver kun 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 kan se, at jeg lavede et par forbedringer:
- Brug forberedt erklæring.
- Brug ikke equalsignorecase. En adgangskode til "FooBar" bør IKKE være det samme som "foobar".
- Indkøb og luk forsigtigt ressourcer i samme omfang for at undgå lækage.
- Har det i en uafhængig og genbrugelig ikke-statisk DAO-metode.
For at lære mere om at bruge JDBC på den rigtige måde kan du finde dette grundlæggende selvstudie nyttigt.