Introduction à l'interface JDBC RowSet en Java

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dans cet article, nous examinons l' interface JDBC RowSet . Un objet JDBC RowSet contient des données tabulaires dans un style qui le rend plus adaptable et plus simple à utiliser qu'un jeu de résultats.

Oracle a défini cinq interfaces RowSet pour les utilisations les plus fréquentes d'un RowSet:

  • JdbcRowSet
  • CachedRowSet
  • WebRowSet
  • JoinRowSet
  • FilteredRowSet

Dans ce didacticiel, nous verrons comment utiliser ces interfaces RowSet .

2. JdbcRowSet

Commençons par le JdbcRowSet - nous allons simplement en créer un en passant un objet Connection au 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)); }

Dans l'exemple ci-dessus, jdbcRs ne contenait aucune donnée jusqu'à ce que nous ayons défini l'instruction SQL avec la méthode setCommand , puis exécuté la méthode execute .

Notez également comment, pour effectuer la gestion des événements, nous avons ajouté un RowSetListener dans le JdbcRowSet.

JdbcRowSet est différent des quatre autres implémentations RowSet - car il est toujours connecté à la base de données et à cause de cela, il est plus similaire à l' objet ResultSet .

3. CachedRowSet

Un objet CachedRowSet est unique car il peut fonctionner sans être connecté à sa source de données. Nous appelons cela un « objet RowSet déconnecté ».

CachedRowSet tire son nom du fait qu'il met ses données en mémoire cache afin de pouvoir fonctionner sur ses propres données au lieu des données stockées dans une base de données.

Comme l' interface CachedRowSet est la super interface pour tous les objets RowSet déconnectés , le code que nous examinons ci-dessous est également applicable à un WebRowSe t, JoinRowSet ou FilteredRowSe t tout aussi bien:

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

Ensuite, jetons un œil au WebRowSet .

Ceci est également unique car, en plus d'offrir les capacités d'un objet CachedRowSet , il peut s'écrire dans un document XML et peut également lire ce document XML pour se reconvertir en 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);

En utilisant la méthode writeXml , nous écrivons l'état actuel d'un objet WebRowSet dans un document XML.

En passant la méthode writeXml à un objet OutputStream , nous écrivons en octets au lieu de caractères, ce qui peut être très utile pour gérer toutes les formes de données.

5. JoinRowSet

JoinRowSet nous permet de créer un SQL JOIN entre des objets RowSet lorsqu'ils sont en mémoire. Ceci est important car cela nous évite d'avoir à créer une ou plusieurs connexions:

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

Étant donné que chaque objet RowSet ajouté à un objet JoinRowSet nécessite une colonne de correspondance, la colonne sur laquelle repose SQL JOIN , nous spécifions «id» dans la méthode addRowSet .

Notez que, plutôt que d'utiliser le nom de la colonne, nous aurions pu également utiliser le numéro de colonne.

6. FilteredRowSet

Enfin, le FilteredRowSet nous permet de réduire le nombre de lignes visibles dans un objet RowSet afin que nous puissions travailler uniquement avec les données pertinentes pour ce que nous faisons.

Nous décidons comment nous voulons «filtrer» les données en utilisant une implémentation de l' interface 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 }

Nous appliquons maintenant ce filtre à un objet 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. Conclusion

Ce didacticiel rapide a couvert les cinq implémentations standard de l' interface RowSet disponibles dans le JDK.

Nous avons discuté de la configuration de chaque implémentation et mentionné les différences entre elles.

Comme nous l'avons souligné, une seule des implémentations RowSet est un objet RowSet connecté - le JdbcRowSet . Les quatre autres sont des objets RowSet déconnectés .

Et, comme toujours, le code complet de cet article est disponible sur Github.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS