Рубрики
Без рубрики

Введение в интерфейс набора строк JDBC в Java

Краткое и практическое введение в интерфейсы наборов строк в Java.

Автор оригинала: Michael Good.

1. Обзор

В этой статье мы рассмотрим интерфейс JDBC RowSet //. Объект JDBC RowSet содержит табличные данные в стиле, который делает его более адаптируемым и простым в использовании, чем результирующий набор.

Oracle определила пять интерфейсов RowSet для наиболее частого использования набора строк :

  • JdbcRowSet
  • CachedRowSet
  • WebRowSet
  • JoinRowSet
  • Фильтрованный набор

В этом уроке мы рассмотрим, как использовать эти интерфейсы 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 с помощью команды method set , а затем не запустили метод execute .

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

JdbcRowSet отличается от других четырех реализаций RowSet – потому что он всегда подключен к базе данных и из-за этого он наиболее похож на объект ResultSet .

3. CachedRowSet

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

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

Поскольку CachedRowSet interface является суперинтерфейсом для всех отключенных объектов набора строк , код, который мы рассмотрим ниже, также применим к WebRowSe t, JoinRowSet или FilteredRowSe t:

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 , он может записывать себя в XML-документ t, а также читать этот 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 позволяет нам создавать SQL JOIN между объектами 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);

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

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

6. FilteredRowSet

Наконец, FilteredRowSet позволяет нам сократить количество строк, которые видны в объекте RowSet , чтобы мы могли работать только с теми данными, которые имеют отношение к тому, что мы делаем.

Мы решаем, как мы хотим “фильтровать” данные, используя реализацию интерфейса Предиката :

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 . Остальные четыре отключены Набор строк объекты.

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