Introduzione all'interfaccia RowSet JDBC in Java

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

In questo articolo, esaminiamo l' interfaccia RowSet JDBC . Un oggetto RowSet JDBC contiene dati tabulari in uno stile che lo rende più adattabile e più semplice da utilizzare rispetto a un set di risultati.

Oracle ha definito cinque interfacce RowSet per gli usi più frequenti di un RowSet:

  • JdbcRowSet
  • CachedRowSet
  • WebRowSet
  • JoinRowSet
  • FilteredRowSet

In questo tutorial, esamineremo come utilizzare queste interfacce RowSet .

2. JdbcRowSet

Cominciamo con JdbcRowSet : ne creeremo semplicemente uno passando un oggetto Connection a JdbcRowSetImpl :

JdbcRowSet jdbcRS = new JdbcRowSetImpl(conn); jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); String sql = "SELECT * FROM customers"; jdbcRS.setCommand(sql); jdbcRS.execute(); jdbcRS.addRowSetListener(new ExampleListener()); while (jdbcRS.next()) { // each call to next, generates a cursorMoved event System.out.println("id = " + jdbcRS.getString(1)); System.out.println("name = " + jdbcRS.getString(2)); }

Nell'esempio precedente, jdbcRs non conteneva dati fino a quando non abbiamo definito l'istruzione SQL con il metodo setCommand e quindi eseguito il metodo execute .

Notare anche come, per eseguire la gestione degli eventi, abbiamo aggiunto un RowSetListener nel JdbcRowSet.

JdbcRowSet è diverso dalle altre quattro implementazioni RowSet , perché è sempre connesso al database e per questo è molto simile all'oggetto ResultSet .

3. CachedRowSet

Un oggetto CachedRowSet è univoco perché può funzionare senza essere connesso alla sua origine dati. Lo chiamiamo un " oggetto RowSet disconnesso ".

CachedRowSet prende il nome perché memorizza nella cache i suoi dati in modo che possa operare sui propri dati invece che sui dati archiviati in un database.

Poiché l' interfaccia CachedRowSet è la super interfaccia per tutti gli oggetti RowSet scollegati , il codice che esaminiamo di seguito è applicabile anche a WebRowSe t, JoinRowSet o FilteredRowSet :

CachedRowSet crs = new CachedRowSetImpl(); crs.setUsername(username); crs.setPassword(password); crs.setUrl(url); crs.setCommand(sql); crs.execute(); crs.addRowSetListener(new ExampleListener()); while (crs.next()) { if (crs.getInt("id") == 1) { System.out.println("CRS found customer1 and will remove the record."); crs.deleteRow(); break; } }

4. WebRowSet

Successivamente, diamo uno sguardo al WebRowSet .

Questo è anche unico perché, oltre a offrire le capacità di un oggetto CachedRowSet , può scrivere se stesso in un documento XML e può anche leggere quel documento XML per riconvertirsi in un WebRowSet :

WebRowSet wrs = new WebRowSetImpl(); wrs.setUsername(username); wrs.setPassword(password); wrs.setUrl(url); wrs.setCommand(sql); wrs.execute(); FileOutputStream ostream = new FileOutputStream("customers.xml"); wrs.writeXml(ostream);

Utilizzando il metodo writeXml , scriviamo lo stato corrente di un oggetto WebRowSet in un documento XML.

Passando al metodo writeXml un oggetto OutputStream , scriviamo in byte invece che in caratteri, il che può essere molto utile per gestire tutte le forme di dati.

5. JoinRowSet

JoinRowSet ci consente di creare un SQL JOIN tra gli oggetti RowSet quando questi sono in memoria. Questo è significativo perché ci risparmia il sovraccarico di dover creare una o più connessioni:

CachedRowSetImpl customers = new CachedRowSetImpl(); // configuration of settings for CachedRowSet CachedRowSetImpl associates = new CachedRowSetImpl(); // configuration of settings for this CachedRowSet JoinRowSet jrs = new JoinRowSetImpl(); jrs.addRowSet(customers,ID); jrs.addRowSet(associates,ID);

Poiché ogni oggetto RowSet aggiunto a un oggetto JoinRowSet necessita di una colonna di corrispondenza, la colonna su cui si basa SQL JOIN , specifichiamo "id" nel metodo addRowSet .

Nota che, invece di usare il nome della colonna, avremmo potuto usare anche il numero della colonna.

6. FilteredRowSet

Infine, FilteredRowSet ci consente di ridurre il numero di righe visibili in un oggetto RowSet in modo da poter lavorare solo con i dati rilevanti per ciò che stiamo facendo.

Decidiamo come vogliamo "filtrare" i dati utilizzando un'implementazione dell'interfaccia Predicate :

public class FilterExample implements Predicate { private Pattern pattern; public FilterExample(String regexQuery) { if (regexQuery != null && !regexQuery.isEmpty()) { pattern = Pattern.compile(regexQuery); } } public boolean evaluate(RowSet rs) { try { if (!rs.isAfterLast()) { String name = rs.getString("name"); System.out.println(String.format( "Searching for pattern '%s' in %s", pattern.toString(), name)); Matcher matcher = pattern.matcher(name); return matcher.matches(); } else return false; } catch (Exception e) { e.printStackTrace(); return false; } } // methods for handling errors }

Ora applichiamo quel filtro a un oggetto FilteredRowSet :

RowSetFactory rsf = RowSetProvider.newFactory(); FilteredRowSet frs = rsf.createFilteredRowSet(); frs.setCommand("select * from customers"); frs.execute(conn); frs.setFilter(new FilterExample("^[A-C].*")); ResultSetMetaData rsmd = frs.getMetaData(); int columncount = rsmd.getColumnCount(); while (frs.next()) { for (int i = 1; i <= columncount; i++) { System.out.println( rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); } }

7. Conclusione

Questo breve tutorial ha coperto le cinque implementazioni standard dell'interfaccia RowSet disponibile in JDK.

Abbiamo discusso la configurazione di ciascuna implementazione e menzionato le differenze tra loro.

Come abbiamo sottolineato, solo una delle implementazioni RowSet è un oggetto RowSet connesso : JdbcRowSet . Gli altri quattro sono oggetti RowSet disconnessi .

E, come sempre, il codice completo di questo articolo può essere trovato su Github.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO