6.1 Introduktion till RowSet
Som ni redan vet är JDBC-standarden nästan 20 år gammal och lite föråldrad. Nya typer och nya klasser läggs sakta till, men detta kan inte göras vackert överallt. Och en av dessa platser är ResultSet .
Databasen kan göras mer effektiv, men ResultSet -gränssnittet passar dåligt. Dessutom skapar vi inte explicit dess objekt någonstans, de returneras till oss av executeQuery()
.
Skaparna av JDBC tänkte inte länge och gjorde en mekanism som är helt parallell med allt som var tidigare. Och det blev känt som RowSet .
Här är dess främsta fördelar:
- RowSet utökar ResultSet-gränssnittet, så dess funktioner är kraftfullare än ResultSets.
- RowSet navigerar mer flexibelt genom tabelldata och kan rulla fram och tillbaka.
- RowSet upprätthåller cachad data som kan användas även efter att anslutningen stängts.
- RowSet stöder ny anslutningsmetod, du kan ansluta till databasen utan anslutning. Det stöder också läsning av XML-datakällan.
- RowSet stöder datafilter.
- RowSet stöder även tabellanslutningsoperationer.
Raduppsättningstyper:
- CachedRowSet
- Filtered RowSet
- JdbcRowSet
- Gå med i RowSet
- WebRowSet
6.2 Skapa ett RowSet-objekt
Det finns tre olika sätt att få ett arbetsobjekt.
Först kan den fyllas med data från en ResultSet som erhållits på klassiskt sätt.
Till exempel kan vi cachelagra ResultSet- data med 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
För det andra kan du skapa ett helt fristående RowSet- objekt genom att skapa din egen databasanslutning för det:
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();
Och för det tredje kan du ansluta RowSet till en redan befintlig anslutning:
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 Exempel på att arbeta med RowSet
Exempel ett: cachelagring .
Låt oss skriva en kod där vi använder CachedRowSet för att cachelagra all data och läsa den från en redan stängd anslutning:
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));
}
Exempel två: ändra rader 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
Om du är intresserad av hur det fungerar kan du läsa ämnet i den officiella dokumentationen. Min uppgift för tillfället är helt enkelt att berätta vad det är.
GO TO FULL VERSION