全体を運搬しているからです データベーステーブルをJavaのメモリに格納し、すべてをテストします。 whileループの行。一致が見つかった場合でもループを中断しないため、最後の行までブール結果が上書きされ続けます。
そうは言っても、あなたは本当にJavaで比較をしたくありません。 SQL WHERE
を利用するだけです。 条項
。それは より効率的で、実際にはDBが実行するはずのタスクです。 JavaでDBの作業を引き継ごうとしないでください。非効率になるだけです。
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;
}
いくつかの機能強化を行ったことがわかります:
- プリペアドステートメントを使用します。
- equalsignorecaseは使用しないでください。 「FooBar」のパスワードは「foobar」と同じであってはなりません。
- リークを回避するために、同じスコープ内のリソースをゆっくりと取得して閉じます。
- 独立した再利用可能な非静的DAO方式で使用してください。
JDBCの適切な使用方法の詳細については、こちらをご覧ください。基本的なチュートリアル 便利です。