Автор оригинала: 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 .