6.1 Einführung in RowSet

Wie Sie bereits wissen, ist der JDBC-Standard fast 20 Jahre alt und etwas veraltet. Es werden langsam neue Typen und neue Klassen hinzugefügt, aber das lässt sich nicht überall schön umsetzen. Und einer dieser Orte ist ResultSet .

Die Datenbank kann effizienter gestaltet werden, aber die ResultSet- Schnittstelle passt nicht. Darüber hinaus erstellen wir seine Objekte nirgendwo explizit, sie werden von uns an uns zurückgegeben executeQuery().

Die Macher von JDBC haben nicht lange nachgedacht und einen Mechanismus entwickelt, der völlig parallel zu allem ist, was es zuvor gab. Und es wurde als RowSet bekannt .

Hier sind die wichtigsten Vorteile:

  • RowSet erweitert die ResultSet-Schnittstelle, sodass seine Funktionen leistungsfähiger sind als die von ResultSet.
  • RowSet navigiert flexibler durch Tabellendaten und kann hin und her scrollen.
  • RowSet verwaltet zwischengespeicherte Daten, die auch nach dem Schließen der Verbindung verwendet werden können.
  • RowSet unterstützt eine neue Verbindungsmethode. Sie können ohne Verbindung eine Verbindung zur Datenbank herstellen. Es unterstützt auch das Lesen der XML-Datenquelle.
  • RowSet unterstützt Datenfilter.
  • RowSet unterstützt auch Tabellenverknüpfungsvorgänge.

Rowset-Typen:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Erstellen eines RowSet-Objekts

Es gibt drei verschiedene Möglichkeiten, ein Arbeitsobjekt zu erhalten.

Erstens kann es mit Daten aus einem auf klassische Weise gewonnenen ResultSet gefüllt werden.

Beispielsweise können wir ResultSet- Daten mithilfe von CachedRowSet zwischenspeichern :


Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
 
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);		// ResultSet zum Auffüllen verwenden

Zweitens können Sie ein vollständig eigenständiges RowSet- Objekt erstellen , indem Sie eine eigene Datenbankverbindung dafür erstellen:


JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");
 
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

Und drittens können Sie das RowSet mit einer bereits bestehenden Verbindung verbinden:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

6.3 Beispiele für die Arbeit mit RowSet

Beispiel eins: Caching .

Schreiben wir einen Code, in dem wir CachedRowSet verwenden , um alle Daten zwischenzuspeichern und aus einer bereits geschlossenen Verbindung zu lesen:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);	// ResultSet zum Auffüllen verwenden

connection.close();		// Verbindung schließen

// Cache-Daten sind noch verfügbar
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

Beispiel zwei: Zeilen über RowSet ändern :

// Mit der Datenbank verbinden
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// Diese Art von Operation kann nur ein eigenständiges RowSet ändern
// Bewegen Sie zunächst den Zeiger auf eine leere (neue) Zeichenfolge. Die aktuelle Position wird gespeichert
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Klon" + System.currentTimeMillis());
 crs.updateString(3, "Weiblich");
 crs.insertRow();  // Füge die aktuelle (neue) Zeile zu den restlichen Zeilen hinzu
 crs.moveToCurrentRow(); // Einen Zeiger auf die Zeile zurückgeben, in der er sich vor dem Einfügen befand

 crs.beforeFirst();
 while(crs.next()) {
 	System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}

// Und jetzt können wir alle unsere Änderungen in die Datenbank hochladen
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Wird für die Synchronisierung benötigt
crs.acceptChanges(con);// Daten mit der Datenbank synchronisieren

Wenn Sie daran interessiert sind, wie es funktioniert, können Sie das Thema in der offiziellen Dokumentation nachlesen. Meine Aufgabe im Moment besteht einfach darin, zu sagen, was es ist.