ResultSet-Anpassung

Mit der modernen JDBC-API können Sie Objekte stark anpassen.StellungnahmeUndErgebnissatz. Zum Beispiel mitErgebnissatzSie können Zeilen in der Datenbank ändern.

Beim Erstellen eines Statement-Objekts können wir eine Reihe unserer Wünsche darin weitergeben. Diese Wünsche lassen sich in drei Gruppen einteilen:

  • Basisverbindungstyp
  • Gleichzeitige Zugriffskontrolle
  • Persistenz und Transaktionen

Diese Parameter können beim Erstellen eines Objekts übergeben werdenStellungnahmeoderPreparedStatement. Beispiel:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Wir werden diese Dinge nicht näher untersuchen, aber ich möchte, dass Sie wissen, dass dies möglich ist, wenn Sie im Code einer anderen Person auf etwas Ähnliches stoßen.

ResultSet-Typen

ResultSet kann von einem bestimmten Typ sein. Der Typ definiert einige der Merkmale und Funktionen des ResultSet.

Nicht alle Typen werden von allen Datenbanken und JDBC-Treibern unterstützt. Sie müssen Ihre Datenbank und Ihren JDBC-Treiber überprüfen, um festzustellen, ob sie den Typ unterstützen, den Sie verwenden möchten. Die Methode DatabaseMetaData.supportsResultSetType(int type) gibt true oder false zurück , je nachdem, ob der angegebene Typ unterstützt wird oder nicht.

Zum Zeitpunkt des Schreibens gibt es drei Arten von ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Der Standardtyp ist TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY bedeutet, dass das ResultSet nur vorwärts verschoben werden kann. Das heißt, Sie können nur von Zeile 1, Zeile 2, Zeile 3 usw. wechseln. In einem ResultSet können Sie nicht rückwärts gehen: Sie können keine Daten aus der 9. Zeile lesen, nachdem Sie die zehnte gelesen haben.

TYPE_SCROLL_INSENSITIVE bedeutet, dass das ResultSet vorwärts oder rückwärts verschoben (gescrollt) werden kann. Sie können sich auch zu einer Position relativ zur aktuellen Position oder zu einer absoluten Position bewegen.

Ein ResultSet dieses Typs ist unempfindlich gegenüber Änderungen an der zugrunde liegenden Datenquelle, während das ResultSet geöffnet ist. Das heißt, wenn ein Eintrag im ResultSet in der Datenbank durch einen anderen Thread oder Prozess geändert wird, wird dies nicht in der bereits geöffneten Datenbank widergespiegeltErgebnissatzdieser Art.

TYPE_SCROLL_SENSITIVE bedeutet, dass das ResultSet vorwärts oder rückwärts verschoben (gescrollt) werden kann. Sie können sich auch zu einer Position relativ zur aktuellen Position oder zu einer absoluten Position bewegen.

Ein ResultSet dieses Typs reagiert empfindlich auf Änderungen in der zugrunde liegenden Datenquelle, während das ResultSet geöffnet ist. Das heißt, wenn ein Eintrag im ResultSet in der Datenbank durch einen anderen Thread oder Prozess geändert wird, wird dies in der bereits geöffneten Datenbank widergespiegeltErgebnissatzdieser Art.

Parallelität

Die Parallelität eines ResultSet bestimmt, ob das ResultSet aktualisiert oder nur gelesen werden kann.

Einige Datenbanken und JDBC-Treiber unterstützen das Aktualisieren eines ResultSets, aber nicht alle. Die Methode DatabaseMetaData.supportsResultSetConcurrency(int concurrency) gibt true oder false zurück , je nachdem, ob der angegebene Parallelitätsmodus unterstützt wird oder nicht.

ResultSet kann eine von zwei Ebenen der Parallelität haben:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY bedeutet, dass das ResultSet nur gelesen werden kann.

CONCUR_UPDATABLE bedeutet, dass das ResultSet gelesen und geändert werden kann.

Ein Beispiel für die Änderung von Daten in der Datenbank

Mit diesen Parametern können Sie die generierte Anweisung und ihr ResultSet steuern.

Sie können beispielsweise ein aktualisierbares ResultSet erstellen und es zum Ändern der Datenbank verwenden. Bei der Erstellung einer Stellungnahme ist es wichtig, folgende Bedingungen zu beachten:

  • Es ist nur eine Tabelle angegeben
  • enthält keine Join- oder Group-by-Klauseln
  • Abfragespalten müssen einen Primärschlüssel enthalten

Wenn die oben genannten Bedingungen erfüllt sind, kann das aktualisierte ResultSet zum Aktualisieren einer Tabelle in der Datenbank verwendet werden. Beim Erstellen eines Statement-Objekts müssen Sie die folgenden Parameter angeben:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Das Ergebnis der Ausführung einer solchen Anweisung ist eine aktualisierbare Ergebnismenge. Die Aktualisierungsmethode besteht darin, den ResultSet-Cursor auf die Zeile zu bewegen, die Sie aktualisieren möchten, und dann die Methode updateXXX() aufzurufen .

Die updateXXX- Methode funktioniert ähnlich wie die getXXX()- Methode . Die Methode updateXXX() hat zwei Parameter. Die erste ist die Nummer der Spalte, die aktualisiert wird. Dabei kann es sich um einen Spaltennamen oder eine Seriennummer handeln. Das zweite sind die Daten, die aktualisiert werden müssen, und dieser Datentyp muss mit XXX identisch sein.

Um die Zeile in der Datenbank tatsächlich zu aktualisieren, müssen Sie die Methode updateRow() aufrufen, bevor der ResultSet-Cursor die geänderte Zeile verlässt, andernfalls gelangen die Änderungen nicht in die Datenbank.

Sie können der Tabelle auch neue Zeilen hinzufügen:

Zuerst müssen Sie den Cursor auf eine leere Zeile bewegen. Rufen Sie dazu die Methode moveToInsertRow() auf .

Anschließend müssen Sie diese Zeile mit der Methode updateXXX() mit Daten füllen .

Anschließend müssen Sie die Methode inserterRow() aufrufen , um die Zeile zur Basis hinzuzufügen.

Und schließlich müssen Sie den Cursor zurückbringen, indem Sie die Methode moveToCurrentRow() aufrufen .

Wichtig! Nicht alle DBMS unterstützen diese Optionen für die erweiterte Anweisung. Bei Problemen lesen Sie die offizielle Dokumentation eines bestimmten DBMS.