Введение в интерфейс JDBC RowSet в Java

Введение в интерфейс JDBC RowSet в Java

1. обзор

В этой статье мы рассматриваем интерфейс 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 определила пять интерфейсовRowSet для наиболее частого использованияRowSet:

  • JdbcRowSet

  • CachedRowSet

  • WebRowSet

  • JoinRowSet

  • FilteredRowSet

В этом руководстве мы рассмотрим, как использовать эти интерфейсыRowSet.

2. JdbcRowSetс

Начнем сJdbcRowSet - мы просто создадим его, передав объектConnection в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));
}

В приведенном выше примереjdbcRs не содержал данных, пока мы не определили оператор SQL с помощью методаsetCommand, а затем запустили методexecute.

Также обратите внимание, как для выполнения обработки событий мы добавилиRowSetListener вJdbcRowSet.

JdbcRowSet отличается от остальных четырех реализацийRowSet - потому чтоit’s always connected to the database и по этой причине он больше всего похож на объектResultSet.

3. CachedRowSetс

ОбъектCachedRowSet уникален, потому что он может работать без подключения к своему источнику данных. Мы называем это «отключенным объектомRowSet».

CachedRowSet получил свое название из-за того, что он кэширует свои данные в памяти, так что он может работать со своими собственными данными вместо данных, хранящихся в базе данных.

Поскольку интерфейсCachedRowSet являетсяsuper interface for all disconnected RowSet objects, код, который мы рассматриваем ниже, также применим кWebRowSet,JoinRowSet или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с

Теперь давайте посмотрим наWebRowSet.

Это также уникально, потому что, помимо предоставления возможностей объектаCachedRowSet,it can write itself to an XML document также может читать этот XML-документ, чтобы преобразовать себя обратно в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);

Используя методwriteXml, мы записываем текущее состояние объектаWebRowSet в XML-документ.

Передавая методуwriteXml объектOutputStream, мы записываем байты вместо символов, что может быть весьма полезно для обработки всех форм данных.

5. JoinRowSetс

JoinRowSet позволяет нам создавать SQLJOIN между объектамиRowSet, когда они находятся в памяти. Это важно, потому что это избавляет нас от необходимости создавать одно или несколько соединений:

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

Поскольку каждый объектRowSet, добавленный к объектуJoinRowSet, нуждается в столбце соответствия, столбце, на котором основан SQLJOIN, мы указываем“id” вaddRowSet метод.

Обратите внимание, что вместо использования имени столбца мы могли бы также использовать номер столбца.

6. FilteredRowSetс

Наконец,FilteredRowSetlets us cut down the number of rows that are visible в объектеRowSet, чтобы мы могли работать только с данными, имеющими отношение к тому, что мы делаем.

Мы решаем, как мы хотим «фильтровать» данные, используя реализацию интерфейса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
}

Теперь применим этот фильтр к объекту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. Заключение

В этом кратком руководстве рассматриваются пять стандартных реализаций интерфейсаRowSet, доступных в JDK.

Мы обсудили конфигурацию каждой реализации и упомянули различия между ними.

Как мы уже отмечали, только одна из реализацийRowSet является подключенным объектомRowSet -JdbcRowSet. Остальные четыре - это отключенные объектыRowSet.

И, как всегда, полный код этой статьи можно найтиover on Github.