Porque você está transportando todo tabela de banco de dados na memória do Java e testando cada linha em um loop while. Você não interrompe o loop se uma correspondência for encontrada para que continue sobrescrevendo o resultado booleano até a última linha.
Dito isso, você realmente não quer fazer a comparação em Java. Basta usar o SQL
WHERE
cláusula
. Isso é muito mais eficiente e realmente a tarefa que um banco de dados deve fazer. Não tente assumir o trabalho do banco de dados em Java, só vai ser ineficiente. 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;
}
Você vê que eu fiz algumas melhorias:
- Use a declaração preparada.
- Não use equalsignorecase. Uma senha de "FooBar" NÃO deve ser igual a "foobar".
- Adquira e feche os recursos com cuidado no mesmo escopo para evitar vazamentos.
- Tê-lo em um método DAO não estático independente e reutilizável.
Para saber mais sobre como usar o JDBC da maneira correta, você pode encontrar este tutorial básico útil.