Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JDBC testet immer die letzte Zeile der MySQL-Tabelle?

Weil Sie das gesamte transportieren Datenbanktabelle in den Speicher von Java und testet alle Zeile in einer While-Schleife. Sie unterbrechen die Schleife nicht, wenn eine Übereinstimmung gefunden wird, sodass das boolesche Ergebnis bis zur letzten Zeile überschrieben wird.

Allerdings möchten Sie den Vergleich wirklich nicht in Java durchführen. Verwenden Sie einfach den SQL WHERE Klausel . Das ist viel effizienter und eigentlich die Aufgabe, die eine DB erfüllen soll. Versuchen Sie nicht, die Arbeit der DB in Java zu übernehmen, das wird nur ineffizient sein.

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

Sie sehen, dass ich einige Verbesserungen vorgenommen habe:

  1. Vorbereitete Anweisung verwenden.
  2. Verwenden Sie nicht equalsignorecase. Ein Passwort von "FooBar" sollte NICHT dasselbe sein wie "foobar".
  3. Erwerben und schließen Sie Ressourcen im gleichen Umfang vorsichtig, um Datenlecks zu vermeiden.
  4. Haben Sie es in einer unabhängigen und wiederverwendbaren nichtstatischen DAO-Methode.

Um mehr über die richtige Verwendung von JDBC zu erfahren, finden Sie dies grundlegendes Tutorial nützlich.