6.1 Inleiding tot RowSet
Zoals u al weet, is de JDBC-standaard bijna 20 jaar oud en een beetje achterhaald. Langzaam komen er nieuwe types en nieuwe klassen bij, maar dit kan niet overal even mooi. En een van die plaatsen is ResultSet .
De database kan efficiënter worden gemaakt, maar de ResultSet- interface past er niet goed bij. Bovendien creëren we de objecten nergens expliciet, ze worden ons teruggegeven door de executeQuery()
.
De makers van JDBC dachten niet lang na en maakten een mechanisme dat volledig parallel loopt aan alles wat daarvoor was. En het werd bekend als RowSet .
Dit zijn de belangrijkste voordelen:
- RowSet breidt de ResultSet-interface uit, dus zijn functies zijn krachtiger dan die van ResultSet.
- RowSet navigeert flexibeler door tabelgegevens en kan heen en weer scrollen.
- RowSet onderhoudt gegevens in de cache die kunnen worden gebruikt, zelfs nadat de verbinding is verbroken.
- RowSet ondersteunt een nieuwe verbindingsmethode, u kunt zonder verbinding verbinding maken met de database. Het ondersteunt ook het lezen van de XML-gegevensbron.
- RowSet ondersteunt gegevensfilter.
- RowSet ondersteunt ook bewerkingen voor het samenvoegen van tabellen.
Soorten rijensets:
- GecachedRowSet
- GefilterdeRowSet
- JdbcRowSet
- JoinRowSet
- WebRowSet
6.2 Een RowSet-object maken
Er zijn drie verschillende manieren om een werkobject te krijgen.
Ten eerste kan het worden gevuld met gegevens uit een op de klassieke manier verkregen ResultSet .
We kunnen bijvoorbeeld ResultSet- gegevens cachen met CachedRowSet :
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
Ten tweede kunt u een volledig op zichzelf staand RowSet- object maken door er uw eigen databaseverbinding voor te maken:
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();
En ten derde kunt u de RowSet verbinden met een reeds bestaande verbinding:
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 Voorbeelden van werken met RowSet
Voorbeeld één: caching .
Laten we een code schrijven waarbij we CachedRowSet gebruiken om alle gegevens in de cache op te slaan en te lezen van een reeds gesloten verbinding:
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));
}
Voorbeeld twee: rijen wijzigen via RowSet :
// 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
Als u geïnteresseerd bent in hoe het werkt, kunt u het onderwerp lezen in de officiële documentatie. Mijn taak op dit moment is eenvoudig te vertellen wat het is.
GO TO FULL VERSION