6.1 Introduktion til RowSet

Som du allerede ved, er JDBC-standarden næsten 20 år gammel og lidt forældet. Nye typer og nye klasser bliver langsomt tilføjet til det, men det kan ikke gøres smukt alle steder. Og et af disse steder er ResultSet .

Databasen kan gøres mere effektiv, men ResultSet- grænsefladen passer dårligt. Derudover opretter vi ikke eksplicit dens objekter nogen steder, de returneres til os af executeQuery().

Skaberne af JDBC tænkte ikke længe og lavede en mekanisme, der er fuldstændig parallel med alt, hvad der var før. Og det blev kendt som RowSet .

Her er dens vigtigste fordele:

  • RowSet udvider ResultSet-grænsefladen, så dens funktioner er mere kraftfulde end ResultSets.
  • RowSet navigerer mere fleksibelt gennem tabeldata og kan rulle frem og tilbage.
  • RowSet vedligeholder cachelagrede data, der kan bruges, selv efter at forbindelsen er lukket.
  • RowSet understøtter ny forbindelsesmetode, du kan oprette forbindelse til databasen uden forbindelse. Det understøtter også læsning af XML-datakilden.
  • RowSet understøtter datafilter.
  • RowSet understøtter også table join-operationer.

Rækkesættyper:

  • CachedRowSet
  • Filtreret rækkesæt
  • JdbcRowSet
  • Deltag i RowSet
  • WebRowSet

6.2 Oprettelse af et RowSet-objekt

Der er tre forskellige måder at få et arbejdsobjekt på.

For det første kan det udfyldes med data fra et ResultSet opnået på klassisk vis.

For eksempel kan vi cache ResultSet- data ved hjælp af 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 andet kan du oprette et fuldstændigt selvstændigt RowSet- objekt ved at oprette din egen databaseforbindelse til 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 forbinde RowSet til en allerede eksisterende forbindelse:

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å arbejde med RowSet

Eksempel et: caching .

Lad os skrive en kode, hvor vi bruger CachedRowSet til at cache alle data og læse dem fra en allerede lukket forbindelse:

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: ændring af rækker 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 interesseret i, hvordan det fungerer, kan du læse emnet i den officielle dokumentation. Min opgave i øjeblikket er simpelthen at fortælle, hvad det er.