Bởi vì bạn đang vận chuyển toàn bộ bảng cơ sở dữ liệu vào bộ nhớ của Java và thử nghiệm mọi hàng trong vòng lặp while. Bạn không phá vỡ vòng lặp nếu tìm thấy một kết quả phù hợp để nó tiếp tục ghi đè kết quả boolean cho đến hàng cuối cùng.
Điều đó nói rằng, bạn thực sự không muốn thực hiện phép so sánh trong Java. Chỉ cần sử dụng SQL WHERE
mệnh đề
. Đó là nhiều hiệu quả hơn và thực sự là nhiệm vụ mà một DB phải làm. Đừng cố gắng tiếp quản công việc của DB trong Java, nó sẽ chỉ kém hiệu quả.
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;
}
Bạn thấy rằng tôi đã thực hiện một số cải tiến:
- Sử dụng câu lệnh chuẩn bị.
- Không sử dụng ký tự viết hoa. Mật khẩu của "FooBar" KHÔNG được giống với "foobar".
- Thu thập và đóng các tài nguyên trong cùng phạm vi một cách nhẹ nhàng để tránh bị rò rỉ.
- Có nó trong một phương pháp DAO không tĩnh độc lập và có thể sử dụng lại.
Để tìm hiểu thêm về cách sử dụng JDBC đúng cách, bạn có thể tìm thấy cái này hướng dẫn cơ bản hữu ích.