1. Обзор
В этой статье мы рассматриваем интерфейс JDBC RowSet
. Объект JDBC RowSet
содержит табличные данные в стиле, который делает его более адаптируемым и простым в использовании, чем набор результатов.
Oracle определил пять интерфейсов RowSet
для наиболее частого использования RowSet:
JdbcRowSet
КэшедРовсет
WebRowSet
ДжойнРоусет
ФильтредРовсет
В этом руководстве мы рассмотрим, как использовать эти интерфейсы 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 тем, что
он всегда подключен к базе данных и поэтому больше всего похож на объект ResultSet .
3. Кэшированный набор строк
Объект CachedRowSet
уникален, поскольку он может работать без подключения к своему источнику данных. Мы называем это «отключенным объектом RowSet ».
CachedRowSet
получил свое название из-за того, что он кэширует свои данные в памяти, чтобы он мог работать со своими собственными данными, а не с данными, хранящимися в базе данных.
Поскольку интерфейс CachedRowSet является
суперинтерфейсом для всех отключенных объектов RowSet , код, который мы рассматриваем ниже, также применим к 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
он может записывать себя в XML-документ, а также может читать этот 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
позволяет нам создавать 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);
Поскольку каждому объекту RowSet
, добавляемому к объекту JoinRowSet
, требуется столбец соответствия, столбец, на котором основано SQL JOIN
, мы указываем «id»
в методе addRowSet
.
Обратите внимание, что вместо имени столбца мы могли бы также использовать номер столбца.
6. Набор фильтрованных строк
Наконец, FilteredRowSet
позволяет нам сократить количество строк, видимых в объекте 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 .
И, как всегда, полный код этой статьи можно найти на Github .