6.1 A RowSet bemutatása

Mint már tudod, a JDBC szabvány majdnem 20 éves és kissé elavult. Lassan új típusok, új osztályok kerülnek rá, de ezt nem mindenhol lehet szépen megcsinálni. És az egyik ilyen hely a ResultSet .

Az adatbázis hatékonyabbá tehető, de a ResultSet interfész rosszul illeszkedik. Ráadásul az objektumait sehol sem hozzuk létre kifejezetten, azokat a executeQuery().

A JDBC alkotói nem gondolkodtak sokáig, és olyan mechanizmust készítettek, amely teljesen párhuzamos mindennel, ami korábban volt. És RowSet néven vált ismertté .

Íme a fő előnyei:

  • A RowSet kiterjeszti a ResultSet felületet, így funkciói erősebbek, mint a ResultSet.
  • A RowSet rugalmasabban navigál a táblázat adatai között, és előre-hátra görgethet.
  • A RowSet tárolja a gyorsítótárban tárolt adatokat, amelyek a kapcsolat lezárása után is használhatók.
  • A RowSet támogatja az új csatlakozási módot, kapcsolat nélkül csatlakozhat az adatbázishoz. Támogatja az XML adatforrás olvasását is.
  • A RowSet támogatja az adatszűrőt.
  • A RowSet támogatja a tábla-illesztési műveleteket is.

Sorkészlet típusok:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 RowSet objektum létrehozása

Három különböző módja van egy munkaobjektum beszerzésének.

Először is, egy klasszikus módon kapott ResultSet adataival tölthető fel .

Például gyorsítótárazhatjuk a ResultSet adatokat a CachedRowSet segítségével :


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

Másodszor, létrehozhat egy teljesen önálló RowSet objektumot saját adatbázis-kapcsolat létrehozásával:


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

Harmadszor pedig csatlakoztathatja a RowSet-et egy már meglévő kapcsolathoz:

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 Példák a RowSet alkalmazásra

Első példa: gyorsítótár .

Írjunk egy kódot, ahol a CachedRowSet segítségével tároljuk az összes adatot, és beolvassuk egy már lezárt kapcsolatból:

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

Második példa: sorok módosítása a RowSet segítségével :

// 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

Ha érdekli a működése, a hivatalos dokumentációban olvashatja a témát. Jelenleg az a feladatom, hogy elmondjam, mi az.