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.