Mysql
 sql >> Base de données >  >> RDS >> Mysql

JDBC teste toujours la dernière ligne de la table MySQL ?

Parce que vous transportez l'intégralité table de base de données dans la mémoire de Java et test chaque rangée dans une boucle while. Vous ne rompez pas la boucle si une correspondance est trouvée afin qu'elle continue d'écraser le résultat booléen jusqu'à la dernière ligne.

Cela dit, vous ne voulez vraiment pas faire la comparaison en Java. Utilisez simplement le SQL WHERE clause . C'est beaucoup plus efficace et vraiment la tâche qu'une base de données est censée faire. N'essayez pas de prendre en charge le travail de la base de données en Java, cela ne fera qu'être inefficace.

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;
}

Vous voyez que j'ai apporté quelques améliorations :

  1. Utilisez une instruction préparée.
  2. N'utilisez pas equalsignorecase. Un mot de passe "FooBar" ne doit PAS être identique à "foobar".
  3. Acquérez et fermez en douceur les ressources dans le même champ d'application pour éviter les fuites.
  4. Avoir dans une méthode DAO non statique indépendante et réutilisable.

Pour en savoir plus sur l'utilisation correcte de JDBC, vous pouvez trouver ceci tutoriel de base utile.