Einführung in die JDBC RowSet-Schnittstelle in Java

Einführung in die JDBC RowSet-Schnittstelle in Java

1. Überblick

In diesem Artikel überprüfen wir die JDBCRowSet-Schnittstelle. A JDBC RowSet object holds tabular data in a style that makes it more adaptable and simpler to use than a result set.

Oracle hat fünfRowSet-Schnittstellen für die häufigsten Verwendungen vonRowSet: definiert

  • JdbcRowSet

  • CachedRowSet

  • WebRowSet

  • JoinRowSet

  • FilteredRowSet

In diesem Tutorial erfahren Sie, wie Sie dieseRowSet-Schnittstellen verwenden.

2. JdbcRowSet

Beginnen wir mit denJdbcRowSet - wir erstellen einfach eine, indem wir einConnection-Objekt an dieJdbcRowSetImpl übergeben:

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

Im obigen Beispiel enthieltjdbcRs keine Daten, bis wir die SQL-Anweisung mit der MethodesetCommand definiert und dann die Methodeexecute ausgeführt haben.

Beachten Sie auch, dass wir zur Durchführung der EreignisbehandlungRowSetListener zuJdbcRowSet. hinzugefügt haben

JdbcRowSet unterscheidet sich von den anderen vierRowSet-Implementierungen - weilit’s always connected to the database und aus diesem Grund demResultSet-Objekt am ähnlichsten ist.

3. CachedRowSet

Das Objekt vonCachedRowSetist eindeutig, da es ohne Verbindung zu seiner Datenquelle betrieben werden kann. Wir nennen dies ein "nicht verbundenesRowSet Objekt".

CachedRowSet erhält seinen Namen aufgrund der Tatsache, dass es seine Daten im Speicher zwischenspeichert, so dass es seine eigenen Daten anstelle der in einer Datenbank gespeicherten Daten verarbeiten kann.

Da die Schnittstelle vonCachedRowSetdiesuper interface for all disconnected RowSet objects ist, gilt der unten beschriebene Code auch fürWebRowSet,JoinRowSet oderFilteredRowSet:

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

Schauen wir uns als nächstes dieWebRowSetan.

Dies ist auch deshalb einzigartig, weilit can write itself to an XML document nicht nur die Funktionen einesCachedRowSet-Objekts bietet, sondern auch dieses XML-Dokument lesen kann, um sich selbst wieder in einWebRowSet zu konvertieren:

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

Mit der MethodewriteXml schreiben wir den aktuellen Status einesWebRowSet-Objekts in ein XML-Dokument.

Indem wir die MethodewriteXml an ein ObjektOutputStreamübergeben, schreiben wir in Bytes anstelle von Zeichen, was für die Verarbeitung aller Arten von Daten sehr hilfreich sein kann.

5. JoinRowSet

MitJoinRowSet können wir ein SQLJOIN zwischenRowSet Objekten erstellen, wenn sich diese im Speicher befinden. Dies ist insofern von Bedeutung, als wir nicht mehr eine oder mehrere Verbindungen erstellen müssen:

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

Da jedesRowSet-Objekt, das einemJoinRowSet-Objekt hinzugefügt wird, eine Übereinstimmungsspalte benötigt, die Spalte, auf der SQLJOIN basiert, geben wir“id” inaddRowSet an Methode.

Beachten Sie, dass wir anstelle des Spaltennamens auch die Spaltennummer verwenden könnten.

6. FilteredRowSet

Schließlich dieFilteredRowSetlets us cut down the number of rows that are visible in einemRowSet-Objekt, so dass wir nur mit den Daten arbeiten können, die für das, was wir tun, relevant sind.

Wir entscheiden, wie wir die Daten mithilfe einer Implementierung derPredicate-Schnittstelle „filtern“ möchten:

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
}

Jetzt wenden wir diesen Filter auf das Objekt einesFilteredRowSetan:

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. Fazit

In diesem kurzen Tutorial wurden die fünf Standardimplementierungen der im JDK verfügbarenRowSet-Schnittstelle behandelt.

Wir haben die Konfiguration jeder Implementierung besprochen und die Unterschiede zwischen ihnen erwähnt.

Wie bereits erwähnt, ist nur eine der Implementierungen vonRowSetein verbundenesRowSet-Objekt - dieJdbcRowSet. Die anderen vier sind nicht verbundeneRowSet-Objekte.

Und wie immer finden Sie den vollständigen Code für diesen Artikel inover on Github.