sql >> データベース >  >> RDS >> Mysql

JDBCは常にMySQLテーブルの最後の行をテストしますか?

    全体を運搬しているからです データベーステーブルを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;
    }
    

    いくつかの機能強化を行ったことがわかります:

    1. プリペアドステートメントを使用します。
    2. equalsignorecaseは使用しないでください。 「FooBar」のパスワードは「foobar」と同じであってはなりません。
    3. リークを回避するために、同じスコープ内のリソースをゆっくりと取得して閉じます。
    4. 独立した再利用可能な非静的DAO方式で使用してください。

    JDBCの適切な使用方法の詳細については、こちらをご覧ください。基本的なチュートリアル 便利です。



    1. ProxySQLとClusterControlを使用したMySQLとMariaDBのクエリキャッシュ

    2. ZendFramework2でのMySQLストアドプロシージャ出力へのアクセス

    3. PymysqlInsertIntoが機能しない

    4. UID12345678のようなSQLで一意のIDを自動的に生成するにはどうすればよいですか?