Интерфейс CachedRowSet
- Все суперинтерфейсы:
-
AutoCloseable,Joinable,ResultSet,RowSet,Wrapper
- Все известные подинтерфейсы:
-
FilteredRowSet,JoinRowSet,WebRowSet
public interface CachedRowSet extends RowSet, Joinable
Интерфейс, который должны реализовывать все стандартные реализации CachedRowSet.
Реализация по умолчанию интерфейса CachedRowSet от корпорации Oracle является стандартной реализацией. Разработчики могут использовать эту реализацию как есть, расширять ее или написать свои собственные реализации этого интерфейса.
Объект CachedRowSet — это контейнер для строк данных, кеширующий свои строки в памяти, что позволяет работать, не будучи постоянно подключенным к источнику данных. Кроме того, это компонент JavaBeans™ и обладает возможностью прокрутки, обновления и сериализации. Объект CachedRowSet обычно содержит строки из набора результатов, но он также может содержать строки из любого файла с табличной структурой, например, электронную таблицу. Реализация по умолчанию поддерживает получение данных только из объекта ResultSet, но разработчики могут расширять реализации SyncProvider для доступа к другим источникам табличных данных.
Приложение может изменять данные в объекте CachedRowSet, и эти изменения могут затем быть проpropagated назад в источник данных.
Объект 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, все наборы строк (rowsets) участвуют в модели событий 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 Установка свойств
Все наборы строк (rowsets) поддерживают набор свойств, которые обычно устанавливаются с помощью инструмента. Количество и типы свойств набора строк будут варьироваться в зависимости от того, что делает набор строк и как он получает свои данные. Например, наборы строк, получающие данные из объектаResultSet , должны установить свойства, необходимые для создания соединения с базой данных. Если набор строк использует механизм DriverManager для создания соединения, ему необходимо установить свойство для URL JDBC, идентифицирующего соответствующий драйвер, а также свойства для имени пользователя и пароля. Если же набор строк использует объект DataSource для создания соединения, что является предпочтительным методом, ему не нужно устанавливать свойство для URL JDBC. Вместо этого, ему нужно установить свойства для логического имени источника данных, имени пользователя и пароля. ПРИМЕЧАНИЕ: Для использования объекта DataSource для создания соединения, объект DataSource должен быть зарегистрирован в службе именования, использующей API Java Naming and Directory Interface™ (JNDI). Эта регистрация обычно выполняется системным администратором.
Для того, чтобы набор строк смог заполнить себя данными из базы данных, ему необходимо установить свойство команды. Это свойство — запрос, являющийся объектом PreparedStatement, что позволяет запросу иметь заполнитель параметров, которые устанавливаются во время выполнения, а не на этапе проектирования. Для установки этих параметров заполнителей со значениями, набор строк предоставляет методы set для установки значений каждого типа данных, аналогично методам set, предоставляемым интерфейсом PreparedStatement.
Следующий фрагмент кода иллюстрирует, как свойство команды объекта CachedRowSet crs может быть установлено. Обратите внимание, что если для установки свойств используется инструмент, это тот код, который инструмент будет использовать.
crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS " +
"WHERE CREDIT_LIMIT > ? AND REGION = ?"); Значения, которые будут использоваться для установки параметров заполнителей команды, содержатся в поле RowSet объекта params, которое является объектом Vector. Класс CachedRowSet предоставляет набор методов set для установки элементов в поле 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 в качестве параметра. В данном коде передается объект conHandle методу execute.
Обратите внимание на два отличия между этим фрагментом кода и предыдущим. Во-первых, метод 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 возвращает объект 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 вернул курсор на последнюю строку. После обработки всех строк на последней странице (объект 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
}
}
- С момента:
- 1.5
Поля
| Модификатор и тип | Поле | Описание |
|---|---|---|
static 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() | Распространяет изменения обновлений, вставок и удалений строк, внесенных в этот |
void | acceptChanges(Connection con) | Распространяет все изменения обновлений, вставок и удалений строк в источник данных, на который ссылается этот |
boolean | columnUpdated(int idx) | Указывает, была ли обновлена указанная колонка в текущей строке этого |
boolean | columnUpdated(String columnName) | Указывает, была ли обновлена указанная колонка в текущей строке этого |
void | commit() | Каждый |
CachedRowSet | createCopy() | Создаёт |
CachedRowSet | createCopyNoConstraints() | Создаёт |
CachedRowSet | createCopySchema() | Создаёт |
RowSet | createShared() | Возвращает новый |
void | execute(Connection conn) | Заполняет этот |
int[] | getKeyColumns() | Возвращает массив, содержащий один или несколько номеров столбцов, которые образуют ключ, уникально идентифицирующий строку в этом |
ResultSet | getOriginal() | Возвращает |
ResultSet | getOriginalRow() | Возвращает |
int | getPageSize() | Возвращает размер страницы для |
RowSetWarning | getRowSetWarnings() | Получает первое предупреждение, сообщённое вызовами на этом |
boolean | getShowDeleted() | Получает |
SyncProvider | getSyncProvider() | Получает реализацию |
String | getTableName() | Возвращает идентификатор объекта (таблицы), который использовался для создания этого |
boolean | nextPage() | Увеличивает текущую страницу |
void | populate(ResultSet data) | Заполняет этот |
void | populate(ResultSet rs,
int startRow) | Заполняет этот |
boolean | previousPage() | Уменьшает текущую страницу |
void | release() | Освобождает текущее содержимое этого |
void | restoreOriginal() | Восстанавливает этот |
void | rollback() | Каждый |
void | rollback(Savepoint s) | Каждый |
void | rowSetPopulated(RowSetEvent event,
int numRows) | Уведомляет зарегистрированных слушателей, что объект RowSet в данном RowSetEvent объекте заполнил несколько дополнительных строк. |
void | setKeyColumns(int[] keys) | Устанавливает для |
void | setMetaData(RowSetMetaData md) | Устанавливает метаданные для этого |
void | setOriginalRow() | Устанавливает текущую строку в этом |
void | setPageSize(int size) | Устанавливает размер страницы |
void | setShowDeleted(boolean b) | Устанавливает свойство |
void | setSyncProvider(String provider) | Устанавливает |
void | setTableName(String tabName) | Устанавливает идентификатор таблицы, из которой был получен этот |
int | size() | Возвращает количество строк в этом |
Collection<?> | toCollection() | Преобразует этот |
Collection<?> | toCollection(int column) | Преобразует указанную колонку в этом |
Collection<?> | toCollection(String column) | Преобразует указанную колонку в этом |
void | undoDelete() | Отменяет удаление текущей строки и уведомляет слушателей о том, что строка изменилась. |
void | undoInsert() | Немедленно удаляет текущую строку из этого |
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.
- См. также:
-
commit(),rollback(), Константы полей
Методы
populate
void populate(ResultSet data)
throws SQLException Заполняет этот CachedRowSet объект данными из предоставленного ResultSet объекта.
Этот метод может использоваться в качестве альтернативы методу execute, когда приложение имеет подключение к открытому ResultSet объекту. Использование метода populate может быть более эффективным, чем использование версии метода execute, который не принимает параметров, поскольку он не открывает новое подключение и не повторно выполняет команду этого CachedRowSet объекта. Использование метода populate более удобно по сравнению с использованием версии execute , которая принимает ResultSet объект.
- Параметры:
-
data- объектResultSet, содержащий данные, которые нужно считать в этотCachedRowSetобъект - Исключения:
-
SQLException- если передан null объектResultSetили этотCachedRowSetобъект не может получить связанный объектResultSetMetaData - См. также:
-
execute(java.sql.Connection),ResultSet,ResultSetMetaData
execute
void execute(Connection conn)
throws SQLException Заполняет этот CachedRowSet объект данными, используя заданное подключение для создания набора результатов, из которого будут считываться данные. Этот метод должен закрывать все созданные базы данных подключения, чтобы убедиться, что этот CachedRowSet объект отключен, за исключением случаев чтения данных из источника данных или записи данных в источник данных.
Читатель для этого CachedRowSet объекта будет использовать conn для установления соединения с источником данных, чтобы он мог выполнить команду набора строк и считать данные из полученного ResultSet объекта в этот CachedRowSet объект. Этот метод также закрывает conn после заполнения этого CachedRowSet объекта.
Если этот метод вызывается, когда реализация уже заполнена, содержимое и метаданные (пере)устанавливаются. Кроме того, если этот метод вызывается до вызова метода acceptChanges для подтверждения ожидающих обновлений, эти обновления теряются.
- Параметры:
-
conn- стандартный JDBC объектConnectionс допустимыми свойствами - Исключения:
-
SQLException- если передан некорректный объектConnectionили произошла ошибка при установлении соединения с источником данных - См. также:
-
populate(java.sql.ResultSet),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(java.sql.Connection),RowSetWriter,SyncFactory,SyncProvider,SyncProviderException,SyncResolver
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 соответственно.
- Параметры:
-
con- стандартный JDBC объектConnection - Исключения:
-
SyncProviderException- если записыватель базового поставщика синхронизации не может записать обновления обратно в источник данных - См. также:
-
acceptChanges(),RowSetWriter,SyncFactory,SyncProvider,SyncProviderException,SyncResolver
restoreOriginal
void restoreOriginal()
throws SQLException Восстанавливает этот CachedRowSet объект до его исходного значения, то есть его значения до последнего набора изменений. Если в наборе строк не было изменений или был только один набор изменений, исходное значение — это значение, с которым был заполнен этот CachedRowSet объект; в противном случае исходное значение — это значение, которое он имел непосредственно перед своим текущим значением.
При вызове этого метода реализация CachedRowSet должна гарантировать, что все обновления, вставки и удаления в текущем экземпляре набора строк заменены предыдущими значениями. Кроме того, курсор должен быть сброшен к первой строке, и должно быть сгенерировано событие rowSetChanged для уведомления всех зарегистрированных слушателей.
- Исключения:
-
SQLException- если при откат текущего значения этого объектаCachedRowSetк его предыдущему значению произошла ошибка - См. также:
RowSetListener.rowSetChanged(javax.sql.RowSetEvent)
release
void release()
throws SQLException Освобождает текущее содержимое этого объекта CachedRowSet и отправляет событие rowSetChanged всем зарегистрированным слушателям. Любые ожидающие обновления отбрасываются, и набор строк не содержит строк после вызова этого метода. Взаимодействия с базовым источником данных нет, и любое содержимое набора строк, метаданные и обновления содержимого должны быть необратимыми.
Этот объект CachedRowSet должен блокироваться до тех пор, пока его содержимое и связанные обновления не будут полностью очищены, тем самым предотвращая «грязные» чтения другими компонентами, которые содержат ссылку на этот объект RowSet. Кроме того, содержимое нельзя освободить до тех пор, пока все компоненты, читающие этот объект CachedRowSet, не завершат свои чтения. Этот объект CachedRowSet должен вернуться к нормальному поведению после срабатывания события rowSetChanged.
Метаданные, включая свойства JDBC и свойства Synchronization SPI, сохраняются для последующего использования. Важно, чтобы свойства, такие как свойство command, были релевантны исходному источнику данных, из которого был первоначально создан этот объект CachedRowSet.
Этот метод очищает набор строк в отличие от метода close, который помечает весь набор строк как восстанавливаемый, чтобы позволить сборщику мусора использовать ресурсы Java VM набора строк.
- Throws:
-
SQLException- если произошла ошибка при очистке содержимого этого объектаCachedRowSet - See Also:
-
RowSetListener.rowSetChanged(javax.sql.RowSetEvent),ResultSet.close()
undoDelete
void undoDelete()
throws SQLException Отменяет удаление текущей строки и уведомляет слушателей о том, что строка изменилась. После вызова этого метода текущая строка больше не помечается для удаления. Этот метод можно вызывать в любое время во время существования набора строк.
Кроме того, несколько отмен удалений строк можно выполнить, скорректировав положение курсора с помощью любого из методов управления положением курсора, таких как:
-
CachedRowSet.absolute -
CachedRowSet.first -
CachedRowSet.last
- Throws:
-
SQLException- если (1) текущая строка не была удалена или (2) курсор находится на строке вставки, перед первой строкой или после последней строки - See Also:
-
undoInsert(),ResultSet.cancelRowUpdates()
undoInsert
void undoInsert()
throws SQLException Немедленно удаляет текущую строку из этого объекта CachedRowSet, если строка была вставлена, а также уведомляет слушателей о том, что строка изменилась. Этот метод можно вызывать в любое время во время существования набора строк и при условии, что текущая строка находится в пределах ограничений исключений (см. ниже), он отменяет вставку строки текущей строки.
Кроме того, несколько отмен вставок строк можно выполнить, скорректировав положение курсора с помощью любого из методов управления положением курсора, таких как:
-
CachedRowSet.absolute -
CachedRowSet.first -
CachedRowSet.last
- Throws:
-
SQLException- если (1) текущая строка не была вставлена или (2) курсор находится перед первой строкой, после последней строки или на строке вставки - See Also:
-
undoDelete(),ResultSet.cancelRowUpdates()
undoUpdate
void undoUpdate()
throws SQLException Немедленно отменяет последнюю операцию обновления, если строка была изменена. Этот метод можно вызывать для отмены обновлений всех столбцов до тех пор, пока все обновления в строке не будут отменены до состояния непосредственно перед последним синхронизированием (acceptChanges) или заполнением. Этот метод также может быть вызван во время выполнения обновлений для строки вставки.
undoUpdate может быть вызван в любое время во время существования набора строк; однако после синхронизации этот метод не действует до тех пор, пока не произойдут дальнейшие изменения данных набора строк.
- Throws:
-
SQLException- если курсор находится перед первой строкой или после последней строки в этом объектеCachedRowSet - See Also:
-
undoDelete(),undoInsert(),ResultSet.cancelRowUpdates()
columnUpdated
boolean columnUpdated(int idx)
throws SQLException Указывает, был ли обновлен указанный столбец в текущей строке этого объекта CachedRowSet.
- Parameters:
-
idx- идентификаторint, определяющий столбец, который нужно проверить на наличие обновлений - Returns:
-
trueесли указанный столбец был явно обновлен;falseв противном случае - Throws:
-
SQLException- если курсор находится на строке вставки, перед первой строкой или после последней строки - See Also:
DatabaseMetaData.updatesAreDetected(int)
columnUpdated
boolean columnUpdated(String columnName)
throws SQLException Указывает, был ли обновлен указанный столбец в текущей строке этого объекта CachedRowSet.
- Parameters:
-
columnName- объектString, содержащий имя столбца, который нужно проверить на наличие обновлений - Returns:
-
trueесли столбец был явно обновлен;falseв противном случае - Throws:
-
SQLException- если курсор находится на строке вставки, перед первой строкой или после последней строки - See Also:
DatabaseMetaData.updatesAreDetected(int)
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(int),toCollection(String)
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(),toCollection(String)
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- если при генерации коллекции произошла ошибка или предоставлен недопустимый идентификатор столбца - См. также:
-
toCollection(),toCollection(int)
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(java.lang.String)
setSyncProvider
void setSyncProvider(String provider)
throws SQLException Устанавливает объект SyncProvider для этого объекта CachedRowSet на указанный. Этот метод позволяет сбросить объект SyncProvider.
Реализация CachedRowSet всегда должна быть инициализирована с доступным механизмом SyncProvider, но существуют случаи, когда желательно или необходимо сбросить объект SyncProvider. Например, приложение может использовать объект SyncProvider по умолчанию некоторое время, а затем выбрать использование поставщика, который стал доступен позже и лучше отвечает его потребностям.
Сброс объекта SyncProvider заставляет объект RowSet запросить новую реализацию SyncProvider у SyncFactory. Это приводит к сбросу всех предыдущих подключений и отношений с исходным источником данных и потенциально может существенно изменить поведение синхронизации отключенного набора строк.
- Параметры:
-
provider- объектString, предоставляющий полное квалифицированное имя реализацииSyncProvider - Выбрасывает:
-
SQLException- если при попытке сбросить реализациюSyncProviderпроизошла ошибка - См. также:
getSyncProvider()
size
int size()
Возвращает количество строк в этом объекте CachedRowSet.
- Возвращает:
- количество строк в наборе строк
setMetaData
void setMetaData(RowSetMetaData md)
throws SQLException Устанавливает метаданные для этого объекта CachedRowSet с помощью предоставленного объекта RowSetMetaData. Когда объект RowSetReader считывает содержимое набора строк, он создает объект RowSetMetaData и инициализирует его с помощью методов реализации RowSetMetaData. Реализация по умолчанию использует класс RowSetMetaDataImpl. Когда обработчик закончил чтение содержимого набора строк, этот метод вызывается внутри, чтобы передать объект RowSetMetaData в набор строк.
- Параметры:
-
md- объектRowSetMetaData, содержащий метаданные о столбцах в этом объектеCachedRowSet - Выбрасывает:
-
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()
setOriginalRow
void setOriginalRow()
throws SQLException Устанавливает текущую строку в этом объекте CachedRowSet в качестве исходной строки.
Этот метод вызывается внутри после синхронизации любых измененных значений в текущей строке с источником данных. Текущая строка должна быть помечена как больше не вставленная, удаленная или обновленная.
Вызов setOriginalRow необратим.
- Выбрасывает:
-
SQLException- если текущей строки нет или при сбросе содержимого исходной строки произошла ошибка - См. также:
getOriginalRow()
getTableName
String getTableName()
throws SQLException Возвращает идентификатор объекта (таблицы), который использовался для создания этого объекта CachedRowSet. Это имя может быть установлено несколько раз, и спецификация не накладывает никаких ограничений на количество таких установок или на то, должны ли стандартные реализации отслеживать предыдущие имена таблиц.
- Возвращает:
- объект
String, предоставляющий имя таблицы, являющейся источником данных для этого объектаCachedRowSetилиnull, если для таблицы не было установлено имени - Выбрасывает:
-
SQLException- если при возвращении имени таблицы произошла ошибка - См. также:
ResultSetMetaData.getTableName(int)
setTableName
void setTableName(String tabName)
throws SQLException Устанавливает идентификатор таблицы, из которой был получен этот объект CachedRowSet, на указанное имя таблицы. Писатель использует это имя для определения таблицы, которую нужно использовать при сравнении значений в источнике данных со значениями объекта CachedRowSet во время попытки синхронизации. Идентификатор таблицы также указывает, куда следует записывать измененные значения из этого объекта CachedRowSet.
Реализация этого объекта CachedRowSet может получить имя из объекта RowSetMetaDataImpl.
- Параметры:
-
tabName- объектString, определяющий таблицу, из которой был получен этот объектCachedRowSet; не может бытьnull, но может быть пустой строкой - Выбрасывает:
-
SQLException- если при присвоении имени таблице произошла ошибка или tabName —null - См. также:
-
RowSetMetaData.setTableName(int, java.lang.String),RowSetWriter,SyncProvider
getKeyColumns
int[] getKeyColumns()
throws SQLException Возвращает массив, содержащий один или несколько номеров столбцов, указывающих столбцы, образующие ключ, уникально идентифицирующий строку в этом объекте CachedRowSet.
- Возвращает:
- массив, содержащий номера столбца или столбцов, указывающие, какие столбцы составляют первичный ключ для строки в этом объекте
CachedRowSet. Этот массив должен быть пустым, если столбцы не представляют собой первичный ключ. - Выбрасывает:
-
SQLException- если этот объектCachedRowSetпустой - См. также:
-
setKeyColumns(int[]),Joinable.getMatchColumnIndexes(),Joinable.getMatchColumnNames()
setKeyColumns
void setKeyColumns(int[] keys)
throws SQLException Устанавливает поле CachedRowSet этого объекта keyCols с помощью заданного массива номеров столбцов, который образует ключ для уникальной идентификации строки в этом объекте CachedRowSet.
Если объект CachedRowSet становится частью объекта JoinRowSet, ключи, определенные этим методом, и соответствующие ограничения сохраняются, если столбцы, обозначенные как столбцы ключа, также становятся столбцами сопоставления.
- Параметры:
-
keys- массивint, указывающий столбцы, формирующие первичный ключ для этого объектаCachedRowSet; каждый элемент массива должен быть больше0и меньше или равен количеству столбцов в этом наборе строк - Исключения:
-
SQLException- если какое-либо число в заданном массиве не является допустимым для этого набора строк - См. также:
-
getKeyColumns(),Joinable.setMatchColumn(String),Joinable.setMatchColumn(int)
createShared
RowSet createShared()
throws SQLException Возвращает новый объект RowSet, поддерживаемый теми же данными, что и этот объект CachedRowSet. По сути, оба объекта CachedRowSet имеют курсор над одними и теми же данными. В результате любые изменения, внесенные дубликатом, видны оригинальному объекту и любым другим дубликатам, точно так же, как изменение, внесенное оригиналом, видно всем его дубликатам. Если дубликат вызывает метод, изменяющий данные, вызываемый метод уведомляет все зарегистрированные слушатели так же, как если бы он вызывался оригинальным объектом CachedRowSet.
Кроме того, любой объект RowSet, созданный этим методом, будет иметь те же свойства, что и этот объект CachedRowSet. Например, если этот объект CachedRowSet является только для чтения, все его дубликаты также будут только для чтения. Если он изменится на обновляемый, дубликаты также станут обновляемыми.
ПРИМЕЧАНИЕ: Если несколько потоков обращаются к объектам RowSet, созданным из метода createShared(), поведение задается для сохранения целостности общих данных: чтение и запись всех общих объектов RowSet должны выполняться последовательно между каждым объектом и единственной лежащей в основе табличной структурой.
- Возвращает:
- новый общий объект
RowSet, имеющий те же свойства, что и этот объектCachedRowSet, и имеющий курсор над теми же данными - Исключения:
-
SQLException- если произошла ошибка или клонирование не поддерживается на базовой платформе - См. также:
-
RowSetEvent,RowSetListener
createCopy
CachedRowSet createCopy()
throws SQLException Создаёт объект RowSet, представляющий глубокую копию данных в этом объекте CachedRowSet. В отличие от объекта RowSet, сгенерированного вызовом createShared, обновления, внесенные в копию оригинального объекта RowSet, не должны быть видны исходному объекту RowSet. Кроме того, любые обработчики событий, зарегистрированные с исходным объектом RowSet, не должны иметь действия над новыми копиями RowSet. Дополнительно должны поддерживаться любые установленные ограничения.
- Возвращает:
- новый объект
RowSet, представляющий глубокую копию этого объектаCachedRowSetи полностью независимый от этого объектаCachedRowSet - Исключения:
-
SQLException- если при создании копии этого объектаCachedRowSetпроизошла ошибка - См. также:
-
createShared(),createCopySchema(),createCopyNoConstraints(),RowSetEvent,RowSetListener
createCopySchema
CachedRowSet createCopySchema()
throws SQLException Создаёт объект CachedRowSet, который представляет собой пустую копию этого объекта CachedRowSet. Копия не должна содержать никакого содержимого, но должна представлять структуру таблицы оригинального объекта CachedRowSet. Кроме того, первичные или внешние ключи, установленные в исходном объекте CachedRowSet, должны быть одинаково применены в новом пустом объекте CachedRowSet. В отличие от объекта RowSet, сгенерированного вызовом метода createShared, обновления, внесенные в копию этого объекта CachedRowSet с использованием метода createCopySchema, не должны быть видны в нём.
Приложения могут сформировать объект WebRowSet из объекта CachedRowSet, возвращённого этим методом, чтобы экспортировать определение схемы RowSet в XML для последующего использования.
- Возвращает:
- пустую копию этого объекта
CachedRowSet - Исключения:
-
SQLException- если при клонировании структуры этого объектаCachedRowSetпроизошла ошибка - См. также:
-
createShared(),createCopySchema(),createCopyNoConstraints(),RowSetEvent,RowSetListener
createCopyNoConstraints
CachedRowSet createCopyNoConstraints()
throws SQLException Создаёт объект CachedRowSet, представляющий собой глубокую копию данных этого объекта CachedRowSet, но независимый от него. В отличие от объекта RowSet, сгенерированного вызовом метода createShared, обновления, внесенные в копию этого объекта CachedRowSet, не должны быть видны в нём. Кроме того, любые обработчики событий, зарегистрированные с этим объектом CachedRowSet, не должны иметь действия над новым объектом RowSet. Кроме того, любые ограничения, установленные для этого объекта CachedRowSet, не должны сохраняться в копии.
- Возвращает:
- новый объект
CachedRowSet, представляющий глубокую копию этого объектаCachedRowSetи полностью независимый от этого объектаCachedRowSet - Исключения:
-
SQLException- если при создании копии этого объектаCachedRowSetпроизошла ошибка - См. также:
-
createCopy(),createShared(),createCopySchema(),RowSetEvent,RowSetListener
getRowSetWarnings
RowSetWarning getRowSetWarnings()
throws SQLException Получает первое предупреждение, сообщённое вызовами этого объекта RowSet. Последующие предупреждения об этом объекте RowSet будут цепочкой к объекту RowSetWarning, возвращённому этим методом. Цепочка предупреждений автоматически очищается каждый раз при чтении новой строки. Этот метод не может быть вызван для объекта RowSet, который был закрыт; при этом будет брошено исключение SQLException.
- Возвращает:
- объект RowSetWarning, первое сообщённое
RowSetWarningили null, если их нет - Исключения:
-
SQLException- если этот метод вызван для закрытого RowSet - См. также:
RowSetWarning
getShowDeleted
boolean getShowDeleted()
throws SQLException Получает значение boolean, указывающее, отображаются ли строки, помеченные на удаление, в наборе текущих строк. Если возвращается true, удалённые строки отображаются вместе с текущими. Если возвращается false, строки не отображаются вместе с набором текущих строк. Значение по умолчанию - false.
Стандартные реализации rowset могут ограничивать это поведение из-за соображений безопасности или для лучшей работы в определённых сценариях развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.
Примечание: разрешение отображения удалённых строк усложняет поведение некоторых стандартных методов JDBC RowSet реализаций. Однако большинство пользователей rowset могут просто проигнорировать эту дополнительную деталь, поскольку только очень специализированные приложения, вероятно, захотят воспользоваться этой функцией.
- Возвращает:
-
trueесли удалённые строки отображаются;falseв противном случае - Исключения:
-
SQLException- если реализация rowset не может определить, отображаются ли строки, помеченные на удаление - См. также:
setShowDeleted(boolean)
setShowDeleted
void setShowDeleted(boolean b)
throws SQLException Устанавливает свойство showDeleted заданному значению boolean, определяющему, отображаются ли строки, помеченные на удаление, в наборе текущих строк. Если значение установлено в true, удалённые строки будут немедленно видны в наборе текущих строк. Если значение установлено в false, удалённые строки не отображаются в текущем наборе строк.
Стандартные реализации rowset могут ограничивать это поведение из-за соображений безопасности или для лучшей работы в определённых сценариях развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.
- Параметры:
-
b-trueесли удалённые строки должны отображаться;falseв противном случае - Исключения:
-
SQLException- если реализация rowset не может переопределить отображаются ли удалённые строки - См. также:
getShowDeleted()
commit
void commit()
throws SQLException Каждый объект CachedRowSet содержит объект Connection из ResultSet или JDBC свойств, переданных в конструкторы. Этот метод оборачивает метод Connection commit для поддержки гибкого управления транзакциями с автоматическим подтверждением или без него.
Делает все изменения, выполненные методом acceptChanges() с момента предыдущего commit/rollback, постоянными. Этот метод должен использоваться только когда режим автоматического подтверждения отключен.
- Исключения:
-
SQLException- если произошла ошибка доступа к базе данных или объект Connection в этом объектеCachedRowSetнаходится в режиме автоматического подтверждения - См. также:
Connection.setAutoCommit(boolean)
rollback
void rollback()
throws SQLException Каждый объект CachedRowSet содержит объект Connection из исходных ResultSet или JDBC свойств, переданных в него.
Отменяет все изменения, внесённые в текущей транзакции. Этот метод должен использоваться только при отключенном режиме автоматического подтверждения.
- Выбрасывает:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этомCachedRowSetнаходится в режиме автоматического подтверждения.
откат
void rollback(Savepoint s)
throws SQLException Каждый объект CachedRowSet содержит объект Connection из исходного ResultSet или свойств JDBC, переданных ему.
Отменяет все изменения, внесённые в текущей транзакции, до последней метки транзакции Savepoint. Этот метод следует использовать только в том случае, если режим автоматического подтверждения отключен.
- Параметры:
-
s- метка транзакцииSavepoint - Выбрасывает:
-
SQLException- если произошла ошибка доступа к базе данных или этот объект Connection в этомCachedRowSetнаходится в режиме автоматического подтверждения.
rowSetPopulated
void rowSetPopulated(RowSetEvent event,
int numRows)
throws SQLException Уведомляет зарегистрированных слушателей, что объект RowSet в заданном объекте RowSetEvent заполнил несколько дополнительных строк. Параметр numRows гарантирует, что это событие будет срабатывать только каждые numRow.
Источник события можно получить с помощью метода event.getSource.
- Параметры:
-
event- объектRowSetEvent, который содержит объектRowSet, являющийся источником событий -
numRows- при заполнении, интервал строк, на котором должно срабатывать событиеCachedRowSetзаполнения; значение по умолчанию равно нулю; не может быть меньшеfetchSizeили нуля - Выбрасывает:
-
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.
- Параметры:
-
startRow- позиция вResultSet, с которой начать заполнение записей в этомCachedRowSet -
rs- объектResultSet, содержащий данные, которые должны быть считаны в этот объектCachedRowSet - Выбрасывает:
-
SQLException- если объектResultSetимеет значение null или этот объектCachedRowSetне может получить связанный объектResultSetMetaData - См. также:
-
execute(java.sql.Connection),populate(ResultSet),ResultSet,ResultSetMetaData
установить размер страницы
void setPageSize(int size)
throws SQLException Устанавливает размер страницы объекта CachedRowSet. Объект CachedRowSet может быть настроен на заполнение себя партиями строк размером страницы. Когда вызываются методы populate() или execute(), CachedRowSet извлекает дополнительную страницу в соответствии с исходным SQL-запросом, используемым для заполнения RowSet.
- Параметры:
-
size- размер страницы объектаCachedRowSet - Выбрасывает:
-
SQLException- если произошла ошибка при установке размера страницы объектаCachedRowSetили если размер страницы меньше 0.
получить размер страницы
int getPageSize()
Возвращает размер страницы для объекта CachedRowSet
- Возвращает:
- размер страницы
int
следующая страница
boolean nextPage()
throws SQLException Увеличивает текущую страницу объекта CachedRowSet. Это приводит к тому, что реализация CachedRowSet извлекает следующие строки размера страницы и заполняет RowSet, если оставшиеся строки остаются в рамках области исходного SQL-запроса, используемого для заполнения RowSet.
- Возвращает:
- true, если существуют другие страницы; false, если это последняя страница
- Выбрасывает:
-
SQLException- если произошла ошибка при извлечении следующей страницы или если этот метод вызван преждевременно до populate или execute.
предыдущая страница
boolean previousPage()
throws SQLException Уменьшает текущую страницу объекта CachedRowSet. Это приводит к тому, что реализация CachedRowSet извлекает предыдущие строки размера страницы и заполняет RowSet. Количество строк, возвращенных на предыдущей странице, всегда должно оставаться в рамках области исходного SQL-запроса, используемого для заполнения RowSet.
- Возвращает:
- true, если предыдущая страница успешно извлечена; false, если это первая страница.
- Выбрасывает:
-
SQLException- если произошла ошибка при извлечении предыдущей страницы или если этот метод вызван преждевременно до populate или execute.
© 1993, 2020, 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/11/docs/api/java.sql.rowset/javax/sql/rowset/CachedRowSet.html