Introduction à l’interface JDBC RowSet en Java

Introduction à l'interface JDBC RowSet en Java

1. Vue d'ensemble

Dans cet article, nous examinons l'interface de JDBCRowSet. A JDBC RowSet object holds tabular data in a style that makes it more adaptable and simpler to use than a result set.

Oracle a défini cinq interfacesRowSet pour les utilisations les plus fréquentes d'unRowSet:

  • JdbcRowSet

  • CachedRowSet

  • WebRowSet

  • JoinRowSet

  • FilteredRowSet

Dans ce didacticiel, nous verrons comment utiliser ces interfacesRowSet.

2. JdbcRowSet

Commençons par lesJdbcRowSet - nous allons simplement en créer un en passant un objetConnection auxJdbcRowSetImpl:

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éthodesetCommand, puis exécuté la méthodeexecute.

Notez également comment, pour effectuer la gestion des événements, nous avons ajouté unRowSetListener dans leJdbcRowSet.

JdbcRowSet est différent des quatre autres implémentations deRowSet - parce queit’s always connected to the database et à cause de cela, il est plus similaire à l'objetResultSet.

3. CachedRowSet

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

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

Comme l'interfaceCachedRowSet est lesuper interface for all disconnected RowSet objects, le code que nous examinons ci-dessous s'applique également à unWebRowSet,JoinRowSet ouFilteredRowSet 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

Voyons ensuite lesWebRowSet.

Ceci est également unique car, en plus d'offrir les capacités d'un objetCachedRowSet,it can write itself to an XML document et peut également lire ce document XML pour se reconvertir en unWebRowSet:

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éthodewriteXml, nous écrivons l'état actuel d'un objetWebRowSet dans un document XML.

En passant la méthodewriteXml à un objetOutputStream, 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 SQLJOIN entre les objetsRowSet lorsqu'ils sont en mémoire. Cela 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);

Parce que chaque objetRowSet ajouté à un objetJoinRowSet nécessite une colonne de correspondance, la colonne sur laquelle le SQLJOIN est basé, nous spécifions“id” dans lesaddRowSet méthode.

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

6. FilteredRowSet

Enfin, lesFilteredRowSetlets us cut down the number of rows that are visible dans un objetRowSet 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'interfacePredicate:

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
}

Maintenant, nous appliquons ce filtre à un objetFilteredRowSet:

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 rapide tutoriel a couvert les cinq implémentations standard de l'interfaceRowSet 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 deRowSet est un objetRowSet connecté - leJdbcRowSet. Les quatre autres sont des objetsRowSet déconnectés.

Et, comme toujours, le code complet de cet article peut être trouvéover on Github.