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);		// Use ResultSet to populate

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);	// Use ResultSet to populate

connection.close();		// Close the connection

// Cache data is still available
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

Beispiel zwei: Zeilen über RowSet ändern :

// Connect to the database
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// This type of operation can only change standalone RowSet
// First, move the pointer to an empty (new) string, the current position is remembered
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Clone" + System.currentTimeMillis());
 crs.updateString(3, "Female");
 crs.insertRow();  // Add the current (new) line to the rest of the lines
 crs.moveToCurrentRow(); // Return a pointer to the line where it was before insertion

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

// And now we can upload all our changes to the database
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Needed for synchronization
crs.acceptChanges(con);// Synchronize data to database

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.