6.1 Introduzione a RowSet

Come già sapete, lo standard JDBC ha quasi 20 anni ed è un po' obsoleto. Nuovi tipi e nuove classi vengono lentamente aggiunti ad esso, ma questo non può essere fatto magnificamente ovunque. E uno di quei posti è ResultSet .

Il database può essere reso più efficiente, ma l' interfaccia ResultSet non è adatta. Inoltre, non creiamo esplicitamente i suoi oggetti da nessuna parte, ci vengono restituiti dal file executeQuery().

I creatori di JDBC non ci hanno pensato a lungo e hanno realizzato un meccanismo completamente parallelo a tutto ciò che era prima. E divenne noto come RowSet .

Ecco i suoi principali vantaggi:

  • RowSet estende l'interfaccia ResultSet, quindi le sue funzioni sono più potenti di quelle di ResultSet.
  • RowSet naviga in modo più flessibile tra i dati della tabella e può scorrere avanti e indietro.
  • RowSet mantiene i dati memorizzati nella cache che possono essere utilizzati anche dopo la chiusura della connessione.
  • RowSet supporta il nuovo metodo di connessione, puoi connetterti al database senza connessione. Supporta anche la lettura dell'origine dati XML.
  • RowSet supporta il filtro dati.
  • RowSet supporta anche operazioni di join di tabelle.

Tipi di set di righe:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Creazione di un oggetto RowSet

Esistono tre modi diversi per ottenere un oggetto di lavoro.

Innanzitutto, può essere riempito con i dati di un ResultSet ottenuto in modo classico.

Ad esempio, possiamo memorizzare nella cache i dati ResultSet utilizzando 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

In secondo luogo, è possibile creare un oggetto RowSet completamente autonomo creando la propria connessione al database per esso:


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

E in terzo luogo, puoi connettere il RowSet a una connessione già esistente:

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 Esempi di utilizzo di RowSet

Esempio uno: memorizzazione nella cache .

Scriviamo un codice in cui usiamo CachedRowSet per memorizzare nella cache tutti i dati e leggerli da una connessione già chiusa:

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

Esempio due: modifica delle righe tramite 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

Se sei interessato a come funziona, puoi leggere l'argomento nella documentazione ufficiale. Il mio compito al momento è semplicemente quello di dire di cosa si tratta.