Интерфейс CachedRowSet
- Все суперинтерфейсы:
-
AutoCloseable,Joinable,ResultSet,RowSet,Wrapper
- Все известные подинтерфейсы:
-
FilteredRowSet,JoinRowSet,WebRowSet
public interface CachedRowSet extends RowSet, Joinable
CachedRowSet. Реализация по умолчанию интерфейса CachedRowSet, предоставленная компанией Oracle Corporation, является стандартной реализацией. Разработчики могут использовать эту реализацию как есть, расширять её или создавать свои реализации этого интерфейса.
Объект CachedRowSet — это контейнер для строк данных, который кэширует свои строки в памяти, что позволяет работать, не будучи постоянно подключённым к источнику данных. Кроме того, это компонент JavaBeans, который является прокручиваемым, обновляемым и сериализуемым. Объект CachedRowSet обычно содержит строки из набора результатов, но он также может содержать строки из любого файла с табличной структурой, например, из электронных таблиц. Реализация по умолчанию поддерживает получение данных только из объекта ResultSet, но разработчики могут расширить реализации SyncProvider для доступа к другим источникам табличных данных.
Приложение может изменять данные в объекте CachedRowSet, и эти изменения могут быть затем перенесены обратно в источник данных.
Объект CachedRowSet — это отключённый набор строк, что означает, что он использует подключение к источнику данных только на короткое время. Он подключается к источнику данных, пока считывает данные для заполнения себя строками, и снова, когда он переносит изменения обратно в базовый источник данных. Остальное время объект CachedRowSet отключён, включая время, когда данные изменяются. Отключение делает объект RowSet более компактным и, следовательно, проще передать другому компоненту. Например, отключённый объект RowSet можно сериализовать и передать по сети тонкому клиенту, например, персональному цифровому ассистенту (PDA).
1.0 Создание объекта CachedRowSet
Следующая строка кода использует конструктор по умолчанию для CachedRowSet, предоставленный в реализации по умолчанию (RI), для создания объекта CachedRowSet по умолчанию.
CachedRowSetImpl crs = new CachedRowSetImpl();
Этот новый объект CachedRowSet будет иметь свои свойства, установленные по умолчанию для объекта BaseRowSet, и, кроме того, он будет иметь объект RIOptimisticProvider в качестве своего поставщика синхронизации. RIOptimisticProvider, одна из двух реализаций SyncProvider, включённых в RI, является поставщиком по умолчанию, который синглтон SyncFactory предоставит, если не указан поставщик синхронизации. Объект SyncProvider предоставляет объекту CachedRowSet считыватель (объект RowSetReader) для считывания данных из источника данных, чтобы заполнить себя данными. Считыватель может быть реализован для чтения данных из объекта ResultSet или из файла с табличной структурой. Объект SyncProvider также предоставляет записыватель (объект RowSetWriter) для синхронизации любых изменений в данных объекта CachedRowSet, внесённых во время отключения, с данными в базовом источнике данных.
Записыватель может быть реализован для обеспечения различных степеней внимательности при проверке конфликтов и их предотвращении. (Конфликт возникает, когда значение в источнике данных было изменено после того, как набор строк заполнил себя этим значением.) Реализация RIOptimisticProvider предполагает, что конфликтов будет мало или вообще не будет, и поэтому не устанавливает блокировки. Она обновляет источник данных значениями из объекта CachedRowSet только в случае отсутствия конфликтов. Другие записыватели могут быть реализованы таким образом, что они всегда записывают изменённые данные в источник данных, что может быть достигнуто либо путём отсутствия проверки конфликтов, либо, с другой стороны спектра, путём установки блокировок, достаточных для предотвращения изменений данных в источнике данных. Ещё другие реализации записывателей могут находиться где-то посередине.
Объект CachedRowSet может использовать любую реализацию SyncProvider, которая была зарегистрирована с синглтоном SyncFactory. Приложение может узнать, какие реализации SyncProvider были зарегистрированы, вызвав следующую строку кода.
java.util.Enumeration providers = SyncFactory.getRegisteredProviders();
Существует два способа указать, какой объект CachedRowSet будет использовать объект SyncProvider.
- Указание имени реализации в конструкторе
Следующая строка кода создаёт объектCachedRowSetcrs2, который инициализируется значениями по умолчанию, за исключением того, что его объектSyncProvider— это указанный объект.CachedRowSetImpl crs2 = new CachedRowSetImpl( "com.fred.providers.HighAvailabilityProvider"); - Установка объекта
SyncProviderс помощью методаCachedRowSetsetSyncProvider
Следующая строка кода сбрасывает объектSyncProviderдля crs, объектаCachedRowSet, созданного с конструктором по умолчанию.crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider");
SyncFactory и SyncProvider для получения более подробной информации. 2.0 Извлечение данных из объекта CachedRowSet
Данные извлекаются из объекта CachedRowSet с помощью методов-геттеров, унаследованных от интерфейса ResultSet. Следующие примеры, в которых crs является объектом CachedRowSet, демонстрируют, как итерироваться по строкам, извлекая значения столбцов в каждой строке. Первый пример использует версию методов-геттеров, принимающую номер столбца; второй пример использует версию, принимающую имя столбца. Номера столбцов обычно используются, когда команда объекта RowSet имеет вид SELECT * FROM TABLENAME; имена столбцов чаще всего используются, когда команда указывает столбцы по имени.
while (crs.next()) {
String name = crs.getString(1);
int id = crs.getInt(2);
Clob comment = crs.getClob(3);
short dept = crs.getShort(4);
System.out.println(name + " " + id + " " + comment + " " + dept);
}
while (crs.next()) {
String name = crs.getString("NAME");
int id = crs.getInt("ID");
Clob comment = crs.getClob("COM");
short dept = crs.getShort("DEPT");
System.out.println(name + " " + id + " " + comment + " " + dept);
}
2.1 Извлечение RowSetMetaData
Приложение может получить информацию о столбцах в объекте CachedRowSet, вызвав методы ResultSetMetaData и RowSetMetaData объекта RowSetMetaData. Следующий фрагмент кода, в котором crs — это объект CachedRowSet, иллюстрирует этот процесс. Первая строка создаёт объект RowSetMetaData с информацией о столбцах в crs. Метод getMetaData, унаследованный от интерфейса ResultSet, возвращает объект ResultSetMetaData, который приводится к типу RowSetMetaData перед присваиванием переменной rsmd. Вторая строка определяет количество столбцов в jrs, а третья — тип JDBC значений, хранящихся во втором столбце объекта jrs.
RowSetMetaData rsmd = (RowSetMetaData)crs.getMetaData();
int count = rsmd.getColumnCount();
int type = rsmd.getColumnType(2);
Интерфейс RowSetMetaData отличается от интерфейса ResultSetMetaData в двух аспектах. -
Он включает методы
setter: ОбъектRowSetиспользует эти методы внутренне, когда он заполняется данными из другого объектаResultSet. -
Он содержит меньше методов
getter: Некоторые методыResultSetMetaDataне применяются к объектуRowSet. Например, методы для получения информации о том, является ли значение столбца изменяемым или только для чтения, не применяются, поскольку все столбцы объектаRowSetбудут изменяемыми или только для чтения в зависимости от того, обновляем ли набор строк.
RowSetMetaData реализации должны переопределить метод getMetaData(), определённый в интерфейсе java.sql.ResultSet, и вернуть объект RowSetMetaData. 3.0 Обновление объекта CachedRowSet
Обновление объекта CachedRowSet похоже на обновление объекта ResultSet, но поскольку набор строк не подключён к источнику данных во время обновления, ему нужно выполнить дополнительный шаг, чтобы повлиять на изменения в базовом источнике данных. После вызова метода updateRow или insertRow, объект CachedRowSet также должен вызвать метод acceptChanges, чтобы изменения были записаны в источник данных. Следующий пример, в котором курсор находится на строке в объекте CachedRowSet crs, демонстрирует код, необходимый для обновления двух значений столбца в текущей строке и обновления базового источника данных объекта RowSet.
crs.updateShort(3, 58);
crs.updateInt(4, 150000);
crs.updateRow();
crs.acceptChanges();
Следующий пример демонстрирует перемещение к строке вставки, создание новой строки в строке вставки, вставку её в набор строк и вызов метода acceptChanges для добавления новой строки в базовый источник данных. Обратите внимание, что, как и в случае с методами-геттерами, методы-апдейтеры могут принимать либо индекс столбца, либо имя столбца для обозначения обрабатываемого столбца.
crs.moveToInsertRow();
crs.updateString("Name", "Shakespeare");
crs.updateInt("ID", 10098347);
crs.updateShort("Age", 58);
crs.updateInt("Sal", 150000);
crs.insertRow();
crs.moveToCurrentRow();
crs.acceptChanges();
ПРИМЕЧАНИЕ: Место, где метод insertRow() вставляет содержимое строки вставки объекта CachedRowSet, определяется реализацией. Реализация по умолчанию для интерфейса CachedRowSet вставляет новую строку сразу после текущей строки, но она может быть реализована для вставки новых строк в любом количестве других мест.
Ещё одна деталь, которую нужно отметить в этих примерах, — это использование метода acceptChanges. Именно этот метод распространяет изменения в объекте CachedRowSet обратно в базовый источник данных, вызывая внутренне метод записывателя объекта RowSet для записи изменений в источник данных. Для этого записывателю приходится нести расходы на установление соединения с этим источником данных. Предыдущие два фрагмента кода вызывают метод acceptChanges сразу после вызова updateRow или insertRow. Однако при изменении нескольких строк более эффективно вызвать acceptChanges после всех вызовов updateRow и insertRow. Если acceptChanges вызывается только один раз, нужно установить только одно соединение.
4.0 Обновление базового источника данных
При выполнении методаacceptChanges за кулисами вызывается записыватель объекта CachedRowSet, объект RowSetWriterImpl, для записи изменений, внесённых в набор строк, в базовый источник данных. Записыватель реализован так, что он устанавливает соединение с источником данных и записывает в него обновления. Записыватель предоставляется через реализацию интерфейса SyncProvider, как обсуждалось в разделе 1, "Создание объекта CachedRowSet". Поставщик реализации по умолчанию RIOptimisticProvider реализовал свой записыватель для использования механизма оптимистического управления параллелизмом. То есть, он не использует блокировки в базе данных, пока набор строк отключён от базы данных, и просто проверяет наличие конфликтов перед записью данных в источник данных. Если конфликты есть, ничего не записывается в источник данных.
Утилита чтения/записи, предоставляемая классом SyncProvider, является подключаемой, что позволяет настраивать получение и обновление данных. Если требуется другой механизм управления конкурентностью, можно подключить другую реализацию класса SyncProvider, используя метод setSyncProvider.
Для использования оптимистичного механизма управления конкурентностью, класс RIOptimisticProvider сохраняет как текущее значение, так и исходное значение (значение, которое оно имело непосредственно перед текущим значением). Обратите внимание, что если в объекте RowSet не было внесено никаких изменений, его текущие и исходные значения совпадают, оба являясь значениями, с которыми объект RowSet был первоначально заполнен. Однако, как только какие-либо значения в объекте RowSet будут изменены, текущие и исходные значения станут разными, хотя на этом этапе исходные значения все еще являются начальными значениями. При последующих изменениях данных в объекте RowSet его исходные и текущие значения будут по-прежнему различаться, но исходные значения будут теми, которые ранее были текущими значениями.
Отслеживание исходных значений позволяет автору сравнить исходное значение объекта RowSet со значением в базе данных. Если значения в базе данных отличаются от исходных значений объекта RowSet, это означает, что значения в базе данных были изменены, и есть конфликт. Проверяет ли автор наличие конфликтов, какой степенью проверки он занимается и как обрабатывает конфликты, зависит от его реализации.
5.0 Регистрация и уведомление слушателей
В качестве компонентов JavaBeans все наборы строк участвуют в модели событий JavaBeans, наследуя методы регистрации слушателей и уведомления их об изменениях от классаBaseRowSet. Слушатель для объекта CachedRowSet — это компонент, который хочет быть уведомлён всякий раз, когда происходят изменения в наборе строк. Например, если объект CachedRowSet содержит результаты запроса, и эти результаты отображаются, скажем, в таблице и столбчатой диаграмме, таблица и столбчатая диаграмма могут быть зарегистрированы в качестве слушателей набора строк, чтобы они могли обновлять себя, отражая изменения. Для того чтобы стать слушателями, классы таблицы и столбчатой диаграммы должны реализовать интерфейс RowSetListener. Затем их можно добавить в список слушателей объекта CachedRowSet, как показано в следующих строках кода.
crs.addRowSetListener(table);
crs.addRowSetListener(barGraph);
Каждый метод CachedRowSet, который перемещает курсор или изменяет данные, также уведомляет зарегистрированных слушателей об изменениях, поэтому слушатели table и barGraph будут уведомлены, когда произойдёт изменение в crs. 6.0 Передача данных тонким клиентам
Одна из основных причин использования объектаCachedRowSet заключается в передаче данных между различными компонентами приложения. Поскольку он сериализуем, объект CachedRowSet можно использовать, например, для отправки результата запроса, выполненного компонентом enterprise JavaBeans, работающим в среде сервера, по сети клиенту, работающему в веб-браузере. Когда объект CachedRowSet отключён, он может быть намного более компактным, чем объект ResultSet с теми же данными. В результате он особенно подходит для отправки данных тонкому клиенту, такому как КПК, где использование драйвера JDBC было бы неприемлемым из-за ограничений ресурсов или соображений безопасности. Таким образом, объект CachedRowSet предоставляет способ "получения строк" без необходимости реализации полного API JDBC.
7.0 Прокрутка и обновление
Вторая важная функция объектовCachedRowSet — обеспечение прокрутки и обновления для объектов ResultSet, которые сами не предоставляют этих возможностей. Другими словами, объект CachedRowSet можно использовать для расширения возможностей драйвера JDBC (далее называемого "драйвером JDBC"), когда СУБД не обеспечивает полную поддержку прокрутки и обновления. Для достижения эффекта преобразования неподдерживаемого и только для чтения объекта ResultSet в прокручиваемый и обновляемый объект, программист должен просто создать объект CachedRowSet, заполненный данными из этого объекта ResultSet. Это показано в следующем фрагменте кода, где stmt — это объект Statement.
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
Объект crs теперь содержит данные из таблицы EMPLOYEES, как и объект rs. Разница заключается в том, что курсор для crs может перемещаться вперёд, назад или к определённой строке, даже если курсор для rs может перемещаться только вперёд. Кроме того, crs обновляется, даже если rs не обновляется, потому что по умолчанию объект CachedRowSet является и прокручиваемым, и обновляемым.
Вкратце, объект CachedRowSet можно рассматривать как просто набор отключённых строк, кэшируемых вне источника данных. Будучи компактным и сериализуемым, он легко передаётся по сети и хорошо подходит для отправки данных тонкому клиенту. Однако у объекта CachedRowSet есть ограничение: его размер ограничен объёмом данных, которые он может хранить в памяти одновременно.
8.0 Получение универсального доступа к данным
Другое преимущество классаCachedRowSet заключается в том, что он позволяет извлекать и сохранять данные из источников, отличных от реляционной базы данных. Чтение для набора строк можно реализовать так, чтобы он читал и заполнял свой набор строк данными из любого табличного источника данных, включая электронную таблицу или плоский файл. Поскольку как объект CachedRowSet, так и его метаданные могут быть созданы с нуля, компонент, действующий как фабрика для наборов строк, может использовать эту возможность для создания набора строк, содержащего данные из не-SQL источников данных. Тем не менее, ожидается, что в большинстве случаев объекты CachedRowSet будут содержать данные, полученные из базы данных SQL с помощью API JDBC.
9.0 Установка свойств
Все наборы строк поддерживают набор свойств, которые обычно устанавливаются с помощью инструмента. Количество и типы свойств набора строк будут различаться в зависимости от функций набора строк и способа получения данных. Например, наборы строк, получающие данные из объектаResultSet, должны установить свойства, необходимые для создания подключения к базе данных. Если набор строк использует утилиту DriverManager для создания подключения, ему необходимо установить свойство для URL JDBC, идентифицирующего соответствующий драйвер, а также установить свойства для имени пользователя и пароля. Если же набор строк использует объект DataSource для создания подключения, что является предпочтительным методом, ему не нужно устанавливать свойство для URL JDBC. Вместо этого ему необходимо установить свойства для логического имени источника данных, имени пользователя и пароля. ПРИМЕЧАНИЕ: для использования объекта DataSource для создания подключения, объект DataSource должен быть зарегистрирован в службе именования, использующей API Java Naming and Directory Interface (JNDI). Эта регистрация обычно выполняется системным администратором.
Для возможности заполнения данными из базы данных набор строк должен установить свойство команды. Это свойство представляет собой запрос, являющийся объектом PreparedStatement, что позволяет запросу иметь параметры-заполнители, которые устанавливаются во время выполнения, а не при проектировании. Для установки этих параметров-заполнителей со значениями набор строк предоставляет методы установки значений для каждого типа данных, аналогично методам установки значений, предоставляемым интерфейсом PreparedStatement.
Следующий фрагмент кода иллюстрирует, как может быть установлено свойство команды для объекта CachedRowSet crs. Обратите внимание, что если для установки свойств используется инструмент, это код, который инструмент будет использовать.
crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS " +
"WHERE CREDIT_LIMIT > ? AND REGION = ?");
Значения, которые будут использоваться для установки параметров-заполнителей команды, содержатся в поле RowSet объекта params, которое является объектом Vector. Класс CachedRowSet предоставляет набор методов установки для установки элементов в поле params. Следующий фрагмент кода демонстрирует установку двух параметров в запросе из предыдущего примера.
crs.setInt(1, 5000);
crs.setString(2, "West");
Поле params теперь содержит два элемента, каждый из которых является массивом из двух элементов. Первый элемент — это номер параметра, второй — значение, которое нужно установить. В данном случае, первый элемент params — это 1, 5000, а второй элемент — это 2, "West". Когда приложение вызывает метод execute, оно, в свою очередь, обращается к методу чтения этого объекта RowSet, который, в свою очередь, вызовет метод readData. В рамках своей реализации метод readData получит значения из params и использует их для установки параметров-заполнителей команды. Следующий фрагмент кода даёт представление о том, как это делает метод чтения после получения объекта Connection con.
PreparedStatement pstmt = con.prepareStatement(crs.getCommand());
reader.decodeParams();
// decodeParams figures out which setter methods to use and does something
// like the following:
// for (i = 0; i < params.length; i++) {
// pstmt.setObject(i + 1, params[i]);
// }
На этом этапе команда для crs — это запрос "SELECT
FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS WHERE CREDIT_LIMIT > 5000
AND REGION = "West". После того, как метод readData выполнит эту команду с помощью следующей строки кода, он будет иметь данные из rs для заполнения crs.
ResultSet rs = pstmt.executeQuery();
Представленные выше фрагменты кода дают представление о том, что происходит за кулисами; они не появятся в приложении, которое не будет вызывать методы, такие как readData и decodeParams. В противоположность этому, следующий фрагмент кода показывает, что может сделать приложение. Оно устанавливает команду набора строк, устанавливает параметры команды и выполняет команду. Просто вызывая метод execute, crs заполняется запрошенными данными из таблицы CUSTOMERS.
crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
"WHERE CREDIT_LIMIT > ? AND REGION = ?");
crs.setInt(1, 5000);
crs.setString(2, "West");
crs.execute();
10.0 Разбиение данных на страницы
Поскольку объектCachedRowSet хранит данные в памяти, количество данных, которое он может содержать в любой момент времени, определяется объёмом доступной памяти. Для решения этой проблемы объект CachedRowSet может извлекать данные из объекта ResultSet частями данных, называемыми *страницами*.setPageSize. Другими словами, если размер страницы установлен в пять, фрагмент из пяти строк данных будет извлечён из источника данных за один раз. Приложение также может необязательно установить максимальное количество строк, которое может быть извлечено за один раз. Если максимальное количество строк установлено в ноль или максимальное количество строк не установлено, ограничений на количество строк, которые могут быть извлечены за один раз, нет. После того как свойства были установлены, объект CachedRowSet должен быть заполнен данными с помощью метода populate или метода execute. Следующие строки кода демонстрируют использование метода populate. Обратите внимание, что этот вариант метода принимает два параметра: дескриптор ResultSet и строку в объекте ResultSet, с которой следует начинать извлечение строк.
CachedRowSet crs = new CachedRowSetImpl();
crs.setMaxRows(20);
crs.setPageSize(4);
crs.populate(rsHandle, 10);
При выполнении этого кода crs будет заполнен четырьмя строками из rsHandle, начиная с десятой строки. Следующий фрагмент кода демонстрирует заполнение объекта CachedRowSet с помощью метода execute, который может или не может принимать объект Connection в качестве параметра. В данном коде передаётся execute объект conHandle.
Обратите внимание на два отличия между следующим фрагментом кода и предыдущим. Во-первых, метод setMaxRows не вызывается, поэтому ограничение на количество строк, которое может содержать crs, не установлено. (Помните, что crs всегда имеет внутреннее ограничение на объём данных, который он может хранить в памяти.) Второе отличие заключается в том, что методу execute нельзя передать номер строки в объекте ResultSet, с которой следует начинать извлечение строк. Этот метод всегда начинает с первой строки.
CachedRowSet crs = new CachedRowSetImpl();
crs.setPageSize(5);
crs.execute(conHandle);
После выполнения этого кода crs будет содержать пять строк данных из объекта ResultSet, созданного командой для crs. Запись в crs будет использовать conHandle для подключения к источнику данных и выполнения команды для crs. Затем приложение сможет обработать данные в crs таким же образом, как обрабатывает данные в любом другом объекте CachedRowSet. Для доступа к следующей странице (фрагменту данных) приложение вызывает метод nextPage. Этот метод создаёт новый объект CachedRowSet и заполняет его следующей частью данных. Например, предположим, что команда объекта CachedRowSet возвращает объект ResultSet rs с 1000 строками данных. Если размер страницы установлен в 100, первый вызов метода nextPage создаст объект CachedRowSet, содержащий первые 100 строк rs. После выполнения необходимых операций с данными в этих первых 100 строках приложение может снова вызвать метод nextPage, чтобы создать другой объект CachedRowSet со следующими 100 строками из rs. Данные из первого объекта CachedRowSet больше не будут находиться в памяти, так как они будут заменены данными из второго объекта CachedRowSet. После десятого вызова метода nextPage десятый объект CachedRowSet будет содержать последние 100 строк данных из rs, которые хранятся в памяти. В любой момент времени в памяти хранятся данные только из одного объекта CachedRowSet.
Метод nextPage возвращает true, пока текущая страница не является последней страницей строк, и false, когда больше нет страниц. Поэтому его можно использовать в цикле while для извлечения всех страниц, как показано в следующих строках кода.
CachedRowSet crs = CachedRowSetImpl();
crs.setPageSize(100);
crs.execute(conHandle);
while(crs.nextPage()) {
while(crs.next()) {
. . . // operate on chunks (of 100 rows each) in crs,
// row by row
}
}
После выполнения этого фрагмента кода приложение обработает все 1000 строк, но в памяти в любой момент времени будет храниться не более 100 строк. Интерфейс CachedRowSet также определяет метод previousPage. Так же как метод nextPage аналогичен методу ResultSet next, метод previousPage аналогичен методу ResultSet previous. Подобно методу nextPage, previousPage создаёт объект CachedRowSet, содержащий количество строк, заданное как размер страницы. Например, метод previousPage можно использовать в цикле while в конце предыдущего фрагмента кода, чтобы вернуться к страницам от последней к первой. Метод previousPage также похож на nextPage, поскольку его можно использовать в цикле while, за исключением того, что он возвращает true, пока существует предыдущая страница, и false, когда больше нет страниц перед ним.
Размещая курсор после последней строки для каждой страницы, как показано в следующем фрагменте кода, метод previous перемещается от последней строки к первой строке на каждой странице. Код также мог бы оставить курсор перед первой строкой на каждой странице и использовать метод next в цикле while для перемещения по каждой странице от первой строки к последней строке.
Следующий фрагмент кода предполагает продолжение предыдущего фрагмента кода, что означает, что курсор для десятого объекта CachedRowSet находится на последней строке. Код перемещает курсор за последнюю строку, чтобы первый вызов метода previous поместил курсор обратно на последнюю строку. После обработки всех строк на последней странице (объект CachedRowSet crs) код затем входит в цикл while, чтобы перейти к девятой странице, пройти по строкам в обратном порядке, перейти к восьмой странице, пройти по строкам в обратном порядке и так далее до первой строки первой страницы.
crs.afterLast();
while(crs.previous()) {
. . . // navigate through the rows, last to first
{
while(crs.previousPage()) {
crs.afterLast();
while(crs.previous()) {
. . . // go from the last row to the first row of each page
}
}
- Since:
- 1.5
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final boolean |
COMMIT_ON_ACCEPT_CHANGES |
Устарело. Так как это поле является final (оно является частью интерфейса), его значение изменить нельзя. |
Поля, объявленные в интерфейсе java.sql.ResultSet
CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE
Краткое описание методов
| Modifier and Type | Method | Description |
|---|---|---|
void |
acceptChanges() |
Распространяет изменения обновлений, вставки и удаления строк, внесенные в этот объект CachedRowSet, на базовый источник данных. |
void |
acceptChanges |
Распространяет все изменения обновлений, вставки и удаления строк в источник данных, лежащий в основе этого объекта CachedRowSet, используя указанный объект Connection для установления соединения с источником данных. |
boolean |
columnUpdated |
Указывает, было ли обновлено указанное столбце в текущей строке этого объекта CachedRowSet. |
boolean |
columnUpdated |
Указывает, было ли обновлено указанное столбце в текущей строке этого объекта CachedRowSet. |
void |
commit() |
Каждое свойство объекта CachedRowSet содержит объект Connection из свойств ResultSet или JDBC, переданных в его конструкторы. |
CachedRowSet |
createCopy() |
Создает объект RowSet, являющийся глубокой копией данных в этом объекте CachedRowSet. |
CachedRowSet |
createCopyNoConstraints() |
Создает объект CachedRowSet, являющийся глубокой копией данных этого объекта CachedRowSet, но независимым от него. |
CachedRowSet |
createCopySchema() |
Создает объект CachedRowSet, являющийся пустой копией этого объекта CachedRowSet. |
RowSet |
createShared() |
Возвращает новый объект RowSet, поддерживаемый теми же данными, что и этот объект CachedRowSet. |
void |
execute |
Заполняет этот объект CachedRowSet данными, используя заданное соединение для создания набора результатов, из которого будут считываться данные. |
int[] |
getKeyColumns() |
Возвращает массив, содержащий один или несколько номеров столбцов, указывающих на столбцы, которые образуют ключ, уникально идентифицирующий строку в этом объекте CachedRowSet. |
ResultSet |
getOriginal() |
Возвращает объект ResultSet, содержащий исходное значение этого объекта CachedRowSet. |
ResultSet |
getOriginalRow() |
Возвращает объект ResultSet, содержащий исходное значение только для текущей строки этого объекта CachedRowSet. |
int |
getPageSize() |
Возвращает размер страницы для объекта CachedRowSet. |
RowSetWarning |
getRowSetWarnings() |
Извлекает первое предупреждение, сообщенное вызовами на этом объекте RowSet. |
boolean |
getShowDeleted() |
Извлекает boolean, указывающий, появляются ли строки, помеченные для удаления, в наборе текущих строк. |
SyncProvider |
getSyncProvider() |
Извлекает реализацию SyncProvider для этого объекта CachedRowSet. |
String |
getTableName() |
Возвращает идентификатор объекта (таблицы), который использовался для создания этого объекта CachedRowSet. |
boolean |
nextPage() |
Увеличивает текущую страницу объекта CachedRowSet. |
void |
populate |
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet. |
void |
populate |
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet. |
boolean |
previousPage() |
Уменьшает текущую страницу объекта CachedRowSet. |
void |
release() |
Освобождает текущее содержимое этого объекта CachedRowSet и отправляет событие rowSetChanged всем зарегистрированным слушателям. |
void |
restoreOriginal() |
Восстанавливает этот объект CachedRowSet до его исходного значения, то есть до значения перед последним набором изменений. |
void |
rollback() |
Каждое свойство объекта CachedRowSet содержит объект Connection из исходных свойств ResultSet или JDBC, переданных в него. |
void |
rollback |
Каждое свойство объекта CachedRowSet содержит объект Connection из исходных свойств ResultSet или JDBC, переданных в него. |
void |
rowSetPopulated |
Уведомляет зарегистрированных слушателей о том, что объект RowSet в заданном объекте RowSetEvent заполнил несколько дополнительных строк. |
void |
setKeyColumns |
Устанавливает поле keyCols этого объекта CachedRowSet с заданным массивом номеров столбцов, который образует ключ для уникальной идентификации строки в этом объекте CachedRowSet. |
void |
setMetaData |
Устанавливает метаданные для этого объекта CachedRowSet с заданным объектом RowSetMetaData. |
void |
setOriginalRow() |
Устанавливает текущую строку в этом объекте CachedRowSet как исходную строку. |
void |
setPageSize |
Устанавливает размер страницы объекта CachedRowSet. |
void |
setShowDeleted |
Устанавливает свойство showDeleted в заданное значение boolean, определяющее, отображаются ли строки, помеченные для удаления, в наборе текущих строк. |
void |
setSyncProvider |
Устанавливает объект SyncProvider для этого объекта CachedRowSet на указанный. |
void |
setTableName |
Устанавливает идентификатор таблицы, из которой был получен этот объект CachedRowSet, на заданное имя таблицы. |
int |
size() |
Возвращает количество строк в этом объекте CachedRowSet. |
Collection |
toCollection() |
Преобразует этот объект CachedRowSet в объект Collection, который содержит все данные этого объекта CachedRowSet. |
Collection |
toCollection |
Преобразует указанный столбец в этом объекте CachedRowSet в объект Collection. |
Collection |
toCollection |
Преобразует указанный столбец в этом объекте CachedRowSet в объект Collection. |
void |
undoDelete() |
Отменяет удаление текущей строки и уведомляет слушателей о том, что строка изменилась. |
void |
undoInsert() |
Немедленно удаляет текущую строку из этого объекта CachedRowSet, если строка была вставлена, а также уведомляет слушателей о том, что строка изменилась. |
void |
undoUpdate() |
Немедленно отменяет последнюю операцию обновления, если строка была изменена. |
Методы, объявленные в интерфейсе javax.sql.rowset.Joinable
getMatchColumnIndexes, getMatchColumnNames, setMatchColumn, setMatchColumn, setMatchColumn, setMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn
Методы, объявленные в интерфейсе java.sql.ResultSet
absolute, afterLast, beforeFirst, cancelRowUpdates, clearWarnings, close, deleteRow, findColumn, first, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isClosed, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull
Методы, объявленные в интерфейсе javax.sql.RowSet
addRowSetListener, clearParameters, execute, getCommand, getDataSourceName, getEscapeProcessing, getMaxFieldSize, getMaxRows, getPassword, getQueryTimeout, getTransactionIsolation, getTypeMap, getUrl, getUsername, isReadOnly, removeRowSetListener, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBlob, setBlob, setBlob, setBoolean, setBoolean, setByte, setByte, setBytes, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setClob, setClob, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDate, setDate, setDouble, setDouble, setEscapeProcessing, setFloat, setFloat, setInt, setInt, setLong, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNClob, setNClob, setNClob, setNString, setNString, setNull, setNull, setNull, setNull, setObject, setObject, setObject, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setRowId, setRowId, setShort, setShort, setSQLXML, setSQLXML, setString, setString, setTime, setTime, setTime, setTime, setTimestamp, setTimestamp, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, setUrl, setURL, setUsername
Методы, объявленные в интерфейсе java.sql.Wrapper
isWrapperFor, unwrap
Подробное описание полей
COMMIT_ON_ACCEPT_CHANGES
@Deprecated static final boolean COMMIT_ON_ACCEPT_CHANGES
CachedRowSet SyncProvider подтвердил изменения при вызове acceptChanges(). Если значение установлено в false, изменения не будут подтверждены до вызова одного из методов транзакции интерфейса CachedRowSet.- См. также:
Подробное описание методов
populate
void populate(ResultSet data) throws SQLException
CachedRowSet данными из заданного объекта ResultSet. Этот метод можно использовать в качестве альтернативы методу execute, когда приложение имеет подключение к открытому объекту ResultSet. Использование метода populate может быть более эффективным, чем использование версии метода execute без параметров, потому что оно не открывает новое подключение и не выполняет заново команду этого объекта CachedRowSet. Использование метода populate является скорее вопросом удобства по сравнению с использованием версии execute, принимающей объект ResultSet.
- Параметры:
-
data- объектResultSet, содержащий данные, которые нужно считать в этот объектCachedRowSet - Исключения:
-
SQLException- если передан объектResultSetили этот объектCachedRowSetне может извлечь связанный объектResultSetMetaData - См. также:
execute
void execute(Connection conn) throws SQLException
CachedRowSet данными, используя указанное подключение для создания набора результатов, из которого будут считываться данные. Этот метод должен закрывать любые созданные подключения к базе данных, чтобы гарантировать, что этот объект CachedRowSet отключен, за исключением случаев чтения данных из источника данных или записи данных в источник данных. Чтец для этого объекта CachedRowSet будет использовать conn для установления соединения с источником данных, чтобы он мог выполнить команду набора строк и считать данные из полученного объекта ResultSet в этот объект CachedRowSet. Этот метод также закрывает conn после заполнения этого объекта CachedRowSet.
Если этот метод вызывается, когда реализация уже заполнена, содержимое и метаданные сбрасываются (переустанавливаются). Также, если этот метод вызывается до вызова метода acceptChanges для подтверждения ожидающих обновлений, эти обновления теряются.
- Параметры:
-
conn- стандартный объект JDBCConnectionс действительными свойствами - Исключения:
-
SQLException- если передан недопустимый объектConnectionили при возникновении ошибки при установлении соединения с источником данных - См. также:
acceptChanges
void acceptChanges() throws SyncProviderException
CachedRowSet, в базовый источник данных. Этот метод обращается к средствам записи этого объекта CachedRowSet, чтобы выполнить работу за кулисами. Стандартные реализации CachedRowSet должны использовать синглтон SyncFactory для получения экземпляра SyncProvider, обеспечивающего объект RowSetWriter (запись). Средство записи попытается распространить внесённые изменения в объект CachedRowSet обратно в источник данных.
При успешном выполнении метода acceptChanges, помимо записи изменений в источник данных, значения в текущей строке становятся значениями в исходной строке.
В зависимости от уровня синхронизации используемой реализации SyncProvider, средство записи сравнит исходные значения со значениями в источнике данных, чтобы проверить наличие конфликтов. При конфликте реализация RIOptimisticProvider, например, выбросит исключение SyncProviderException и ничего не запишет в источник данных.
Приложение может выбрать перехват объекта SyncProviderException и извлечь содержащийся в нём объект SyncResolver. Объект SyncResolver перечисляет конфликты строка за строкой и устанавливает блокировку на источнике данных, чтобы избежать дальнейших конфликтов, пока текущие конфликты не будут разрешены. Кроме того, для каждого конфликта он предоставляет методы для проверки конфликта и установки значения, которое должно быть сохранено в источнике данных. После разрешения всех конфликтов приложение должно снова вызвать метод acceptChanges, чтобы записать разрешённые значения в источник данных. Если все значения в источнике данных уже являются значениями, которые нужно сохранить, метод acceptChanges ничего не делает.
Некоторые реализации поставщика могут использовать блокировки, чтобы гарантировать отсутствие конфликтов. В таких случаях гарантируется, что средство записи успешно запишет изменения в источник данных при вызове метода acceptChanges. Этот метод можно вызывать сразу после вызова методов updateRow, insertRow или deleteRow, но более эффективно вызывать его только один раз после внесения всех изменений, чтобы необходимо было установить только одно подключение.
Примечание: Метод acceptChanges() определит, установлено ли значение COMMIT_ON_ACCEPT_CHANGES в true или нет. Если оно установлено в true, все обновления в синхронизации подтверждаются в источнике данных. В противном случае приложение должно явно вызвать методы commit() или rollback(), соответственно.
- Исключения:
-
SyncProviderException- если средство записи базового поставщика синхронизации не может записать обновления обратно в источник данных - См. также:
acceptChanges
void acceptChanges(Connection con) throws SyncProviderException
CachedRowSet объекта, используя указанный Connection объект для установления соединения с источником данных. Другой вариант метода acceptChanges не принимает соединение, потому что он использует Connection объект, уже определённый внутри RowSet объекта, который является соединением, используемым для его первоначального заполнения.
Этот вариант метода acceptChanges аналогичен варианту без аргументов; однако, в отличие от другого варианта, этот вариант может быть использован только тогда, когда базовый источник данных является источником данных JDBC. Обновлённые Connection свойства должны быть использованы SyncProvider для сброса конфигурации RowSetWriter, чтобы обеспечить правильную синхронизацию содержимого CachedRowSet объекта.
При успешном выполнении метода acceptChanges, помимо записи изменений в источник данных, значения в текущей строке становятся значениями в исходной строке.
В зависимости от уровня синхронизации используемой реализации SyncProvider, писатель будет сравнивать исходные значения с теми, что находятся в источнике данных, чтобы проверить наличие конфликтов. При возникновении конфликта реализация RIOptimisticProvider, например, выбрасывает исключение SyncProviderException и ничего не записывает в источник данных.
Приложение может выбрать перехват SyncProviderException объекта и извлечь содержащийся в нём SyncResolver объект. SyncResolver объект перечисляет конфликты строка за строкой и устанавливает блокировку на источнике данных, чтобы предотвратить дальнейшие конфликты во время разрешения текущих. Кроме того, для каждого конфликта он предоставляет методы для проверки конфликта и установки значения, которое должно быть сохранено в источнике данных. После разрешения всех конфликтов приложение должно снова вызвать метод acceptChanges, чтобы записать разрешённые значения в источник данных. Если все значения в источнике данных уже являются значениями, которые должны быть сохранены, метод acceptChanges ничего не делает.
Некоторые реализации поставщиков могут использовать блокировки для обеспечения отсутствия конфликтов. В таких случаях гарантируется, что писатель успешно запишет изменения в источник данных при вызове метода acceptChanges. Этот метод может быть вызван сразу после вызова методов updateRow, insertRow или deleteRow, но более эффективно вызывать его только один раз после всех изменений, чтобы установить только одно соединение.
Примечание: метод acceptChanges() определит, установлен ли COMMIT_ON_ACCEPT_CHANGES в значение true или нет. Если он установлен в значение true, все обновления в синхронизации сохраняются в источнике данных. В противном случае приложение обязательно должно явно вызвать методы commit или rollback, как соответствующим образом.
- Parameters:
-
con- стандартный JDBCConnectionобъект - Throws:
-
SyncProviderException- если внутренний поставщик синхронизации не может записать обновления обратно в источник данных - See Also:
restoreOriginal
void restoreOriginal() throws SQLException
CachedRowSet объект до его исходного значения, то есть до значения перед последним набором изменений. Если изменений в наборе строк не было или был только один набор изменений, исходное значение — это значение, с которым этот CachedRowSet объект был заполнен; в противном случае исходное значение — это значение, которое он имел непосредственно перед своим текущим значением. При вызове этого метода реализация CachedRowSet должна гарантировать, что все обновления, вставки и удаления в текущей строке экземпляра набора строк заменяются предыдущими значениями. Кроме того, курсор должен быть сброшен на первую строку, и должно быть сгенерировано событие rowSetChanged, чтобы уведомить всех зарегистрированных слушателей.
- Throws:
-
SQLException- если произошла ошибка при отмене текущего значения этогоCachedRowSetобъекта до его предыдущего значения - See Also:
release
void release() throws SQLException
CachedRowSet объекта и отправляет событие rowSetChanged всем зарегистрированным слушателям. Любые ожидающие обновления отбрасываются, и набор строк не содержит строк после вызова этого метода. Взаимодействия с основным источником данных отсутствуют, и любое содержимое набора строк, метаданные и обновления содержимого не должны быть восстанавливаемыми. Этот CachedRowSet объект должен блокироваться до тех пор, пока его содержимое и связанные обновления не будут полностью очищены, тем самым предотвращая «грязные» чтения другими компонентами, которые содержат ссылку на этот RowSet объект. Кроме того, содержимое не может быть освобождено до тех пор, пока все компоненты, считывающие этот CachedRowSet объект, не завершат свои чтения. Этот CachedRowSet объект должен вернуться к нормальному поведению после генерации события rowSetChanged.
Метаданные, включая свойства JDBC и свойства SPI синхронизации, сохраняются для дальнейшего использования. Важно, чтобы такие свойства, как свойство command, были релевантны исходному источнику данных, из которого этот CachedRowSet объект был первоначально создан.
Этот метод очищает набор строк, в отличие от метода close, который помечает весь набор строк как восстанавливаемый, чтобы разрешить сборщику мусора ресурсы Java VM набора строк.
- Throws:
-
SQLException- если произошла ошибка при очистке содержимого этогоCachedRowSetобъекта - See Also:
undoDelete
void undoDelete() throws SQLException
Кроме того, можно выполнить несколько отмен удалений строк, скорректировав положение курсора с помощью любого из методов управления позицией курсора, таких как:
-
CachedRowSet.absolute -
CachedRowSet.first -
CachedRowSet.last
- Throws:
-
SQLException- если (1) текущая строка не была удалена или (2) курсор находится на строке вставки, перед первой строкой или после последней строки - See Also:
undoInsert
void undoInsert() throws SQLException
CachedRowSet объекта, если строка была вставлена, и уведомляет слушателей о том, что строка изменилась. Этот метод можно вызывать в любое время во время существования набора строк, и при условии, что текущая строка находится в пределах ограничений исключений (см. ниже), он отменяет вставку строки текущей строки. Кроме того, можно выполнить несколько отмен вставок строк, скорректировав положение курсора с помощью любого из методов управления позицией курсора, таких как:
-
CachedRowSet.absolute -
CachedRowSet.first -
CachedRowSet.last
- Throws:
-
SQLException- если (1) текущая строка не была вставлена или (2) курсор находится перед первой строкой, после последней строки или на строке вставки - See Also:
undoUpdate
void undoUpdate() throws SQLException
acceptChanges) или заполнением. Этот метод также можно вызвать во время выполнения обновлений для строки вставки. undoUpdate может быть вызван в любое время во время существования набора строк; однако после выполнения синхронизации этот метод не имеет эффекта до тех пор, пока не произойдут дальнейшие изменения данных набора строк.
- Throws:
-
SQLException- если курсор находится перед первой строкой или после последней строки в этомCachedRowSetобъекте - See Also:
columnUpdated
boolean columnUpdated(int idx) throws SQLException
CachedRowSet объекта.- Parameters:
-
idx-int, идентифицирующий столбец, который необходимо проверить на наличие обновлений - Returns:
-
true, если указанный столбец был явно обновлён;falseв противном случае - Throws:
-
SQLException- если курсор находится на строке вставки, перед первой строкой или после последней строки - See Also:
columnUpdated
boolean columnUpdated(String columnName) throws SQLException
CachedRowSet объекта.- Parameters:
-
columnName- объектString, содержащий имя колонки, которая проверяется на обновления - Returns:
-
true, если колонка была явно обновлена;falseв противном случае - Throws:
-
SQLException- если курсор находится на строке вставки, до первой строки или после последней строки - See Also:
toCollection
Collection<?> toCollection() throws SQLException
CachedRowSet в объект Collection, содержащий все данные этого объекта CachedRowSet. Реализации имеют некоторую свободу в представлении этого объекта Collection из-за абстрактной природы фреймворка Collection. Каждая строка должна быть полностью представлена в реализации общего назначения Collection или специализированной реализации Collection, например, объекта TreeMap или объекта Vector. Значение колонки SQL NULL должно быть представлено как null в языке программирования Java. Стандартная реализация для интерфейса CachedRowSet использует объект TreeMap для набора строк, значения в каждой строке содержатся в объектах Vector. Ожидается, что большинство реализаций сделают то же самое.
Тип коллекции TreeMap гарантирует, что карта будет упорядочена по возрастанию ключей, отсортированных в соответствии с естественным порядком для класса ключа. Каждый ключ ссылается на объект Vector, который соответствует одной строке объекта RowSet. Следовательно, размер каждого объекта Vector должен быть точно равен количеству столбцов в объекте RowSet. Ключ, используемый коллекцией TreeMap, определяется реализацией, которая может выбрать использование набора ключей, доступного в внутренней табличной структуре RowSet благодаря ключу, уже заданному в объекте RowSet или в базовых данных SQL.
- Returns:
- объект
Collection, содержащий значения в каждой строке в этом объектеCachedRowSet - Throws:
-
SQLException- если при генерации коллекции произошла ошибка - See Also:
toCollection
Collection<?> toCollection(int column) throws SQLException
CachedRowSet в объект Collection. Реализации имеют некоторую свободу в представлении этого объекта Collection из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено в реализации общего назначения Collection или специализированной реализации Collection, например, объекта Vector. Значение колонки SQL NULL должно быть представлено как null в языке программирования Java. Стандартная реализация использует объект Vector для хранения значений колонок, и ожидается, что большинство реализаций сделают то же самое. Если используется объект Vector, его размер должен быть точно равен количеству строк в этом объекте CachedRowSet.
- Parameters:
-
column-int, указывающий колонку, значения которой должны быть представлены в объектеCollection - Returns:
- объект
Collection, содержащий значения, хранящиеся в указанной колонке этого объектаCachedRowSet - Throws:
-
SQLException- если при генерации коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки - See Also:
toCollection
Collection<?> toCollection(String column) throws SQLException
CachedRowSet в объект Collection. Реализации имеют некоторую свободу в представлении этого объекта Collection из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено в реализации общего назначения Collection или специализированной реализации Collection, например, объекта Vector. Значение колонки SQL NULL должно быть представлено как null в языке программирования Java. Стандартная реализация использует объект Vector для хранения значений колонок, и ожидается, что большинство реализаций сделают то же самое. Если используется объект Vector, его размер должен быть точно равен количеству строк в этом объекте CachedRowSet.
- Parameters:
-
column- объектString, содержащий имя колонки, значения которой должны быть представлены в коллекции - Returns:
- объект
Collection, содержащий значения, хранящиеся в указанной колонке этого объектаCachedRowSet - Throws:
-
SQLException- если при генерации коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки - See Also:
getSyncProvider
SyncProvider getSyncProvider() throws SQLException
SyncProvider для этого объекта CachedRowSet. Внутренне этот метод используется набором строк для запуска операций чтения или записи между набором строк и источником данных. Например, набор строк может потребовать получить доступ к обработчику набора строк (объект RowSetReader) от SyncProvider, чтобы позволить набору строк заполниться.
RowSetReader rowsetReader = null;
SyncProvider provider =
SyncFactory.getInstance("javax.sql.rowset.provider.RIOptimisticProvider");
if (provider instanceof RIOptimisticProvider) {
rowsetReader = provider.getRowSetReader();
}
Предположим, rowsetReader является закрытым, доступным полем в реализации набора строк, когда приложение вызывает метод execute, оно, в свою очередь, вызывает метод readData обработчика для заполнения объекта RowSet.
rowsetReader.readData((RowSetInternal)this);
Кроме того, приложение может использовать объект SyncProvider, возвращаемый этим методом, для вызова методов, возвращающих информацию об объекте SyncProvider, включая информацию о поставщике, версии, идентификаторе поставщика, степени синхронизации и блокировках, которые он в настоящее время установил.
- Returns:
- объект
SyncProvider, установленный при создании набора строк, или, если он не был установлен, поставщик по умолчанию - Throws:
-
SQLException- если при возвращении объектаSyncProviderпроизошла ошибка - See Also:
setSyncProvider
void setSyncProvider(String provider) throws SQLException
SyncProvider для этого объекта CachedRowSet на указанный. Этот метод позволяет сбросить объект SyncProvider. Реализация CachedRowSet всегда должна быть инициализирована с доступным механизмом SyncProvider, но существуют случаи, когда сброс объекта SyncProvider желателен или необходим. Например, приложение может использовать объект поставщика по умолчанию некоторое время, а затем выбрать поставщика, который стал доступен позже и лучше соответствует его потребностям.
Сброс объекта SyncProvider заставляет объект RowSet запросить новую реализацию SyncProvider у SyncFactory. Это приводит к сбросу всех предыдущих соединений и отношений с исходным источником данных и потенциально может значительно изменить поведение синхронизации отключенного набора строк.
- Parameters:
-
provider- объектString, содержащий полное квалифицированное имя реализацииSyncProvider - Throws:
-
SQLException- если при попытке сбросить реализациюSyncProviderпроизошла ошибка - See Also:
size
int size()
CachedRowSet.- Returns:
- количество строк в наборе строк
setMetaData
void setMetaData(RowSetMetaData md) throws SQLException
CachedRowSet с помощью данного объекта RowSetMetaData. Когда объект RowSetReader считывает содержимое набора строк, он создает объект RowSetMetaData и инициализирует его с помощью методов в реализации RowSetMetaData. Реализация по умолчанию использует класс RowSetMetaDataImpl. Когда читатель завершил чтение содержимого набора строк, этот метод вызывается внутренне для передачи объекта RowSetMetaData набору строк.- Parameters:
-
md- объектRowSetMetaData, содержащий метаданные о колонках в этом объектеCachedRowSet - Throws:
-
SQLException- если набору строк предоставлены недопустимые метаданные
getOriginal
ResultSet getOriginal() throws SQLException
ResultSet, содержащий исходное значение этого объекта CachedRowSet. Курсор объекта ResultSet должен быть размещён перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:
- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.CONCUR_UPDATABLE
Исходное значение объекта RowSet — это значение, которое у него было до последней синхронизации с исходным источником данных. Если синхронизаций не было, исходное значение будет значением, с которым объект RowSet был заполнен. Этот метод вызывается в процессе работы, когда приложение вызывает метод acceptChanges, а объект SyncProvider реализован для проверки конфликтов. В этом случае писатель сравнивает исходное значение со значением, в настоящее время находящимся в источнике данных, чтобы проверить наличие конфликтов.
- Возвращает:
- объект
ResultSet, содержащий исходное значение для этого объектаCachedRowSet - Исключение:
-
SQLException— если при создании объектаResultSetпроизошла ошибка
getOriginalRow
ResultSet getOriginalRow() throws SQLException
ResultSet, содержащий исходное значение только для текущей строки этого объекта CachedRowSet. Курсор объекта ResultSet должен быть размещён перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:
- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.CONCUR_UPDATABLE
- Возвращает:
- исходный результат набора для строки
- Исключение:
-
SQLException— если текущей строки нет - См. также:
setOriginalRow
void setOriginalRow() throws SQLException
CachedRowSet в качестве исходной строки. Этот метод вызывается в процессе работы после того, как любые изменённые значения в текущей строке были синхронизированы с источником данных. Текущая строка должна быть помечена как больше не вставленная, удалённая или обновлённая.
Вызов метода setOriginalRow необратим.
- Исключение:
-
SQLException— если текущей строки нет или при сбросе содержимого исходной строки произошла ошибка - См. также:
getTableName
String getTableName() throws SQLException
CachedRowSet. Это имя может быть установлено несколько раз, и спецификация не накладывает ограничений на то, сколько раз это может произойти или должны ли стандартные реализации отслеживать предыдущие имена таблиц.- Возвращает:
- объект
String, содержащий имя таблицы, являющейся источником данных для этого объектаCachedRowSet, илиnull, если для таблицы не было установлено имени - Исключение:
-
SQLException— если при возвращении имени таблицы произошла ошибка - См. также:
setTableName
void setTableName(String tabName) throws SQLException
CachedRowSet, на заданное имя таблицы. Писатель использует это имя для определения таблицы, которую следует использовать при сравнении значений в источнике данных со значениями объекта CachedRowSet во время попытки синхронизации. Идентификатор таблицы также указывает, куда следует записывать изменённые значения из этого объекта CachedRowSet. Реализация этого объекта CachedRowSet может получить имя из объекта RowSetMetaDataImpl.
- Параметры:
-
tabName— объектString, идентифицирующий таблицу, из которой был получен этот объектCachedRowSet; не может бытьnull, но может быть пустой строкой - Исключение:
-
SQLException— если при присвоении имени таблице произошла ошибка или tabName являетсяnull - См. также:
getKeyColumns
int[] getKeyColumns() throws SQLException
CachedRowSet.- Возвращает:
- массив, содержащий номер или номера столбцов, которые указывают, какие столбцы составляют первичный ключ для строки в этом объекте
CachedRowSet. Этот массив должен быть пустым, если ни один столбец не представляет собой первичный ключ. - Исключение:
-
SQLException— если этот объектCachedRowSetпуст - См. также:
setKeyColumns
void setKeyColumns(int[] keys) throws SQLException
CachedRowSet этого объекта keyCols с заданным массивом номеров столбцов, который образует ключ для уникальной идентификации строки в этом объекте CachedRowSet. Если объект CachedRowSet становится частью объекта JoinRowSet, ключи, определённые этим методом и полученные ограничения, сохраняются, если столбцы, обозначенные как ключевые столбцы, также становятся сопоставляющими столбцами.
- Параметры:
-
keys— массивint, указывающий столбцы, которые образуют первичный ключ для этого объектаCachedRowSet; каждый элемент массива должен быть больше0и меньше или равен количеству столбцов в этом наборе строк - Исключение:
-
SQLException— если какие-либо числа в заданном массиве не являются допустимыми для этого набора строк - См. также:
createCopy
CachedRowSet createCopy() throws SQLException
RowSet, который является глубокой копией данных в этом объекте CachedRowSet. В отличие от объекта RowSet, созданного вызовом createShared, обновления, внесённые в копию исходного объекта RowSet, не должны быть видны исходному объекту RowSet. Кроме того, любые слушатели событий, зарегистрированные с исходным объектом RowSet, не должны иметь область действия над новыми копиями RowSet. Кроме того, любые ограничения, установленные ограничениями, должны сохраняться.- Возвращает:
- новый объект
RowSet, который является глубокой копией этого объектаCachedRowSetи полностью независим от этого объектаCachedRowSet - Исключение:
-
SQLException— если при создании копии этого объектаCachedRowSetпроизошла ошибка - См. также:
createCopySchema
CachedRowSet createCopySchema() throws SQLException
CachedRowSet, являющийся пустой копией этого объекта CachedRowSet. Копия не должна содержать никаких данных, а только представлять структуру таблицы исходного объекта CachedRowSet. Кроме того, ограничения первичного или внешнего ключа, заданные в исходном объекте CachedRowSet, должны быть одинаково применены к новому пустому объекту CachedRowSet. В отличие от объекта RowSet, сгенерированного методом createShared, изменения, внесённые в копию этого объекта CachedRowSet с помощью метода createCopySchema, не должны быть видны исходному объекту. Приложения могут сформировать объект WebRowSet из объекта CachedRowSet, возвращённого этим методом, для экспорта определения схемы RowSet в XML для последующего использования.
- Возвращает:
- Пустую копию этого объекта
CachedRowSet - Выбрасывает:
-
SQLException- если произошла ошибка при клонировании структуры этого объектаCachedRowSet - См. также:
createCopyNoConstraints
CachedRowSet createCopyNoConstraints() throws SQLException
CachedRowSet, являющийся глубокой копией данных этого объекта CachedRowSet, но независимым от него. В отличие от объекта RowSet, сгенерированного методом createShared, изменения, внесённые в копию этого объекта CachedRowSet, не должны быть видны исходному объекту. Кроме того, любые обработчики событий, зарегистрированные с этим объектом CachedRowSet, не должны иметь область действия над новым объектом RowSet. Кроме того, любые ограничения, установленные для этого объекта CachedRowSet, не должны сохраняться в копии.- Возвращает:
- новый объект
CachedRowSet, являющийся глубокой копией этого объектаCachedRowSetи полностью независимый от этого объектаCachedRowSet - Выбрасывает:
-
SQLException- если произошла ошибка при генерации копии этого объектаCachedRowSet - См. также:
getRowSetWarnings
RowSetWarning getRowSetWarnings() throws SQLException
RowSet. Последующие предупреждения этого объекта RowSet будут присоединены к объекту RowSetWarning, который возвращает этот метод. Цепочка предупреждений автоматически очищается каждый раз при чтении новой строки. Этот метод не может быть вызван на закрытом объекте RowSet; в противном случае будет выброшено исключение SQLException.- Возвращает:
- Объект RowSetWarning первое предупреждение или null, если их нет
- Выбрасывает:
-
SQLException- если этот метод вызывается на закрытом RowSet - См. также:
getShowDeleted
boolean getShowDeleted() throws SQLException
boolean, удалённые строки видны вместе с текущими строками. Если возвращается true, строки не отображаются в наборе текущих строк. Значение по умолчанию - false. Стандартные реализации rowset могут ограничивать это поведение из соображений безопасности или для лучшей адаптации к определённым сценариям развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.
Примечание: Разрешение удалённых строк для отображения усложняет поведение некоторых стандартных методов реализации JDBC RowSet. Однако большинство пользователей rowset могут просто проигнорировать этот дополнительный деталь, поскольку только очень специализированные приложения, вероятно, захотят воспользоваться этой функцией.
- Возвращает:
-
true, если удалённые строки видны;falseв противном случае - Выбрасывает:
-
SQLException- если реализация rowset не может определить, видны ли строки, помеченные для удаления - См. также:
setShowDeleted
void setShowDeleted(boolean b) throws SQLException
showDeleted заданному значению boolean, которое определяет, отображаются ли строки, помеченные для удаления, в наборе текущих строк. Если значение установлено в true, удалённые строки немедленно отображаются вместе с текущими строками. Если значение установлено в false, удалённые строки скрываются из набора текущих строк. Стандартные реализации rowset могут ограничивать это поведение из соображений безопасности или для лучшей адаптации к определённым сценариям развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.
- Параметры:
-
b-true, если необходимо отображать удалённые строки;falseв противном случае - Выбрасывает:
-
SQLException- если реализация rowset не может установить отображение удалённых строк - См. также:
commit
void commit() throws SQLException
CachedRowSet содержит объект SyncProvider из параметров Connection или JDBC, переданных в его конструкторы. Этот метод оборачивает метод Connection commit, чтобы поддерживать гибкий авто-коммит или не авто-коммит для управления транзакциями. Делает все изменения, выполненные методом acceptChanges() с момента предыдущего commit/rollback, постоянными. Этот метод следует использовать только в том случае, если режим авто-коммита отключён.
- Выбрасывает:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме авто-коммита - См. также:
rollback
void rollback() throws SQLException
CachedRowSet содержит объект SyncProvider из оригинальных параметров ResultSet или JDBC, переданных в него. Отменяет все изменения, внесённые в текущей транзакции. Этот метод следует использовать только в случае, если режим авто-коммита отключён.
- Выбрасывает:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме авто-коммита.
rollback
void rollback(Savepoint s) throws SQLException
CachedRowSet содержит объект SyncProvider из оригинальных параметров ResultSet или JDBC, переданных в него. Отменяет все изменения, внесённые в текущей транзакции, до последней метки транзакции Savepoint. Этот метод следует использовать только в случае, если режим авто-коммита отключён.
- Параметры:
-
s- Метка транзакцииSavepoint - Выбрасывает:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме авто-коммита.
rowSetPopulated
void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
numRows гарантирует, что это событие будет срабатывать только каждые numRow строк. Источник события может быть получен методом event.getSource.
- Параметры:
-
event- объектRowSetEvent, содержащий объектRowSet, являющийся источником событий -
numRows- при заполнении, интервал строк, на котором событиеCachedRowSetpopulated должно срабатывать; значение по умолчанию 0; не может быть меньшеfetchSizeили 0 - Выбрасывает:
-
SQLException-numRows < 0 or numRows < getFetchSize()
populate
void populate(ResultSet rs, int startRow) throws SQLException
CachedRowSet объект данными из указанного ResultSet объекта. Хотя это связано с методом populate(ResultSet), дополнительный параметр позволяет указать начальную позицию в ResultSet, с которой следует заполнить экземпляр CachedRowSet. Этот метод можно использовать в качестве альтернативы методу execute, когда в приложении есть подключение к открытому объекту ResultSet. Использование метода populate может быть эффективнее, чем версия метода execute без параметров, поскольку оно не открывает новое подключение и не повторно выполняет команду этого объекта CachedRowSet. Использование метода populate более удобно по сравнению с использованием версии execute, принимающей объект ResultSet.
- Parameters:
-
rs- объектResultSet, содержащий данные, которые необходимо считать в этот объектCachedRowSet -
startRow- позиция вResultSet, с которой следует начать заполнение записей в этот объектCachedRowSet - Throws:
-
SQLException- если передан нулевой объектResultSetили этот объектCachedRowSetне может получить связанный объектResultSetMetaData - See Also:
setPageSize
void setPageSize(int size) throws SQLException
CachedRowSet. Объект CachedRowSet может быть настроен для заполнения себя порциями строк размером page-size. При вызове методов populate() или execute(), CachedRowSet извлекает дополнительную страницу в соответствии с исходным SQL-запросом, используемым для заполнения RowSet.- Parameters:
-
size- размер страницы объектаCachedRowSet - Throws:
-
SQLException- если произошла ошибка при установке размера страницыCachedRowSetили если размер страницы меньше 0.
getPageSize
int getPageSize()
CachedRowSet- Returns:
- размер страницы
int
nextPage
boolean nextPage() throws SQLException
CachedRowSet. Это заставляет реализацию CachedRowSet извлечь строки следующей страницы размером page-size и заполнить RowSet, если оставшиеся строки остаются в рамках области исходного SQL-запроса, используемого для заполнения RowSet.- Returns:
- true, если существуют другие страницы; false, если это последняя страница
- Throws:
-
SQLException- если при извлечении следующей страницы произошла ошибка или если этот метод был вызван преждевременно до populate или execute.
previousPage
boolean previousPage() throws SQLException
CachedRowSet. Это заставляет реализацию CachedRowSet извлечь строки предыдущей страницы размером page-size и заполнить RowSet. Количество строк, возвращаемых на предыдущей странице, должно всегда оставаться в пределах области исходного SQL-запроса, используемого для заполнения RowSet.- Returns:
- true, если предыдущая страница успешно извлечена; false, если это первая страница.
- Throws:
-
SQLException- если при извлечении предыдущей страницы произошла ошибка или если этот метод был вызван преждевременно до populate или execute.
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.sql.rowset/javax/sql/rowset/CachedRowSet.html