Интерфейс 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 объекту Connection 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. Аналогично методу 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
Краткое описание полей
| Modifier and Type | Field | Description |
|---|---|---|
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
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
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, переданных в него. |
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 и свойства Synchronization SPI, сохраняются для будущего использования. Важно, чтобы такие свойства, как свойство command, были актуальны для исходного источника данных, из которого был первоначально создан этот объект CachedRowSet.
Этот метод опустошает набор строк, в отличие от метода close, который помечает весь набор строк как восстанавливаемый, чтобы разрешить сборщику мусора ресурсы виртуальной машины Java набора строк.
- 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 объекта.- Параметры:
-
idx-int, определяющий колонку, которую следует проверить на обновления - Возвращает:
-
true, если указанная колонка была видимо обновлена;falseв противном случае - Выбрасывает:
-
SQLException- если курсор находится на строке вставки, до первой строки или после последней строки - См. также:
columnUpdated
boolean columnUpdated(String columnName) throws SQLException
CachedRowSet объекта.- Параметры:
-
columnName- объектString, содержащий имя колонки, которую следует проверить на обновления - Возвращает:
-
true, если колонка была видимо обновлена;falseв противном случае - Выбрасывает:
-
SQLException- если курсор находится на строке вставки, до первой строки или после последней строки - См. также:
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.
- Возвращает:
- объект
Collection, содержащий значения в каждой строке в этом объектеCachedRowSet - Выбрасывает:
-
SQLException- если при создании коллекции произошла ошибка - См. также:
toCollection
Collection<?> toCollection(int column) throws SQLException
CachedRowSet в объект Collection. Реализации имеют некоторую свободу в том, как они могут представлять этот Collection объект из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено либо в реализации общего назначения Collection, либо в специализированной реализации Collection, например, объект Vector. Значение SQL-колонки NULL должно быть представлено как null на языке программирования Java. Стандартная реализация использует объект Vector для хранения значений колонки, и ожидается, что большинство реализаций сделают то же самое. Если используется объект Vector, его размер должен быть точно равен количеству строк в этом объекте CachedRowSet.
- Параметры:
-
column-int, указывающий колонку, значения которой следует представить в объектеCollection - Возвращает:
- объект
Collection, содержащий значения, хранящиеся в указанной колонке этого объектаCachedRowSet - Выбрасывает:
-
SQLException- если при создании коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки - См. также:
toCollection
Collection<?> toCollection(String column) throws SQLException
CachedRowSet в объект Collection. Реализации имеют некоторую свободу в том, как они могут представлять этот Collection объект из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено либо в реализации общего назначения Collection, либо в специализированной реализации Collection, например, объект Vector. Значение SQL-колонки NULL должно быть представлено как null на языке программирования Java. Стандартная реализация использует объект Vector для хранения значений колонки, и ожидается, что большинство реализаций сделают то же самое. Если используется объект Vector, его размер должен быть точно равен количеству строк в этом объекте CachedRowSet.
- Параметры:
-
column- объектString, содержащий имя колонки, значения которой следует представить в коллекции - Возвращает:
- объект
Collection, содержащий значения, хранящиеся в указанной колонке этого объектаCachedRowSet - Выбрасывает:
-
SQLException- если при создании коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки - См. также:
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, включая информацию о поставщике, версии, идентификаторе поставщика, синхронизационной степени и блокировках, которые он в данный момент установил.
- Возвращает:
- объект
SyncProvider, установленный при создании набора строк, или, если он не был установлен, — поставщик по умолчанию - Выбрасывает:
-
SQLException- если при возвращении объектаSyncProviderпроизошла ошибка - См. также:
setSyncProvider
void setSyncProvider(String provider) throws SQLException
SyncProvider для этого объекта CachedRowSet на указанный. Этот метод позволяет сбросить объект SyncProvider. Реализация CachedRowSet всегда должна быть инициирована с доступным механизмом SyncProvider, но есть случаи, когда сброс объекта SyncProvider желателен или необходим. Например, приложение может захотеть использовать объект поставщика по умолчанию в течение некоторого времени, а затем выбрать поставщика, который недавно стал доступен и лучше подходит его потребностям.
Сброс объекта SyncProvider заставляет объект RowSet запросить новую реализацию SyncProvider от SyncFactory. Это приводит к сбросу всех предыдущих подключений и отношений с исходным источником данных и потенциально может значительно изменить поведение синхронизации отключенного набора строк.
- Параметры:
-
provider- объектString, содержащий полное имя класса реализацииSyncProvider - Выбрасывает:
-
SQLException- если при попытке сбросить реализациюSyncProviderпроизошла ошибка - См. также:
size
int size()
CachedRowSet.- Возвращает:
- количество строк в наборе строк
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 реализован для проверки конфликтов. В этом случае писатель сравнивает исходное значение со значением, которое сейчас находится в источнике данных, чтобы проверить конфликты.
- Returns:
- объект
ResultSet, содержащий исходное значение для этого объектаCachedRowSet - Throws:
-
SQLException- если произошла ошибка при создании объектаResultSet
getOriginalRow
ResultSet getOriginalRow() throws SQLException
ResultSet, содержащий исходное значение только для текущей строки этого объекта CachedRowSet. Курсор объекта ResultSet должен быть расположен перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:
- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.CONCUR_UPDATABLE
- Returns:
- исходный результат набора для строки
- Throws:
-
SQLException- если текущей строки нет - See Also:
setOriginalRow
void setOriginalRow() throws SQLException
CachedRowSet в качестве исходной строки. Этот метод вызывается внутренне после того, как любые изменённые значения в текущей строке были синхронизированы с источником данных. Текущая строка должна быть помечена как больше не вставленная, удалённая или обновлённая.
Вызов метода setOriginalRow необратим.
- Throws:
-
SQLException- если текущей строки нет или при сбросе содержимого исходной строки возникла ошибка - See Also:
getTableName
String getTableName() throws SQLException
CachedRowSet. Это имя может быть установлено несколько раз, и спецификация не накладывает никаких ограничений на то, сколько раз это может произойти или должны ли стандартные реализации отслеживать предыдущие имена таблиц.- Returns:
- объект
String, содержащий имя таблицы, являющейся источником данных для этого объектаCachedRowSet, илиnull, если для таблицы не было установлено имени - Throws:
-
SQLException- если при возвращении имени таблицы возникла ошибка - See Also:
setTableName
void setTableName(String tabName) throws SQLException
CachedRowSet, в указанное имя таблицы. Писатель использует это имя, чтобы определить, какую таблицу использовать при сравнении значений в источнике данных со значениями объекта CachedRowSet во время попытки синхронизации. Идентификатор таблицы также указывает, куда должны быть записаны изменённые значения из этого объекта CachedRowSet. Реализация этого объекта CachedRowSet может получить имя из объекта RowSetMetaDataImpl.
- Parameters:
-
tabName- объектString, идентифицирующий таблицу, из которой был получен этот объектCachedRowSet; не может бытьnull, но может быть пустой строкой - Throws:
-
SQLException- если при присвоении имени таблицы возникла ошибка или tabName имеет значениеnull - See Also:
getKeyColumns
int[] getKeyColumns() throws SQLException
CachedRowSet.- Returns:
- массив, содержащий номер или номера столбцов, которые указывают, какие столбцы составляют первичный ключ для строки в этом объекте
CachedRowSet. Этот массив должен быть пустым, если столбцы не представляют собой первичный ключ. - Throws:
-
SQLException- если этот объектCachedRowSetпуст - See Also:
setKeyColumns
void setKeyColumns(int[] keys) throws SQLException
CachedRowSet этого объекта keyCols с заданным массивом номеров столбцов, который образует ключ для однозначной идентификации строки в этом объекте CachedRowSet. Если объект CachedRowSet становится частью объекта JoinRowSet, ключи, определённые этим методом и получившиеся ограничения, сохраняются, если столбцы, обозначенные как ключевые, также становятся столбцами соответствия.
- Parameters:
-
keys- массивint, указывающий столбцы, которые образуют первичный ключ для этого объектаCachedRowSet; каждый элемент массива должен быть больше0и меньше или равен числу столбцов в этом наборе строк - Throws:
-
SQLException- если какое-либо из чисел в данном массиве не является допустимым для этого набора строк - See Also:
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 из свойств ResultSet или JDBC, переданных в его конструкторы. Этот метод оборачивает метод Connection commit, чтобы позволить гибкое автоматическое подтверждение или поддержку транзакционного управления без автоматического подтверждения. Делает все изменения, выполненные методом acceptChanges() с момента предыдущего подтверждения/отката, постоянными. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.
- Исключение:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме автоматического подтверждения - См. также:
rollback
void rollback() throws SQLException
CachedRowSet имеет объект SyncProvider, содержащий объект Connection из исходных свойств ResultSet или JDBC, переданных ему. Отменяет все изменения, внесённые в текущей транзакции. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.
- Исключение:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме автоматического подтверждения.
rollback
void rollback(Savepoint s) throws SQLException
CachedRowSet имеет объект SyncProvider, содержащий объект Connection из исходных свойств ResultSet или JDBC, переданных ему. Отменяет все изменения, внесённые в текущей транзакции, до последней метки транзакции Savepoint. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.
- Параметры:
-
s- Метка транзакцииSavepoint - Исключение:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этом объектеCachedRowSetнаходится в режиме автоматического подтверждения.
rowSetPopulated
void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
numRows гарантирует, что это событие будет срабатывать только каждые numRow. Источник события можно получить с помощью метода event.getSource.
- Parameters:
-
event- объектRowSetEvent, содержащий объектRowSet, являющийся источником событий -
numRows- при заполнении интервал строк, по которому должно срабатывать событиеCachedRowSetзаполнения; значение по умолчанию равно нулю; не может быть меньшеfetchSizeили нуля - Throws:
-
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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.sql.rowset/javax/sql/rowset/CachedRowSet.html