6.1 Introduksjon til RowSet

Som du allerede vet, er JDBC-standarden nesten 20 år gammel og litt utdatert. Nye typer og nye klasser blir sakte lagt til den, men dette kan ikke gjøres vakkert overalt. Og et av disse stedene er ResultSet .

Databasen kan gjøres mer effektiv, men ResultSet- grensesnittet passer dårlig. I tillegg oppretter vi ikke eksplisitt objektene deres hvor som helst, de returneres til oss av executeQuery().

Skaperne av JDBC tenkte ikke lenge og laget en mekanisme som er helt parallell med alt som var før. Og det ble kjent som RowSet .

Her er de viktigste fordelene:

  • RowSet utvider ResultSet-grensesnittet, slik at funksjonene er kraftigere enn ResultSet.
  • RowSet navigerer mer fleksibelt gjennom tabelldata og kan rulle frem og tilbake.
  • RowSet opprettholder hurtigbufrede data som kan brukes selv etter at tilkoblingen er lukket.
  • RowSet støtter ny tilkoblingsmetode, du kan koble til databasen uten tilkobling. Den støtter også lesing av XML-datakilden.
  • RowSet støtter datafilter.
  • RowSet støtter også table join-operasjoner.

Radsetttyper:

  • Cached RowSet
  • Filtered RowSet
  • JdbcRowSet
  • Bli med i RowSet
  • WebRowSet

6.2 Opprette et RowSet-objekt

Det er tre forskjellige måter å skaffe et arbeidsobjekt på.

For det første kan den fylles med data fra et resultatsett oppnådd på klassisk måte.

For eksempel kan vi hurtigbufre ResultSet- data ved å bruke 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

For det andre kan du opprette et fullstendig selvstendig RowSet- objekt ved å opprette din egen databasetilkobling for 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();

Og for det tredje kan du koble RowSet til en allerede eksisterende tilkobling:

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 Eksempler på arbeid med RowSet

Eksempel én: caching .

La oss skrive en kode der vi bruker CachedRowSet til å bufre alle dataene og lese dem fra en allerede lukket tilkobling:

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));
}

Eksempel to: endre 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

Hvis du er interessert i hvordan det fungerer, kan du lese emnet i den offisielle dokumentasjonen. Min oppgave for øyeblikket er rett og slett å fortelle hva det er.