Spec-Zone.ru › OpenJDK 17

Интерфейс CachedRowSet

Все суперинтерфейсы:
AutoCloseable, Joinable, ResultSet, RowSet, Wrapper
Все известные подинтерфейсы:
FilteredRowSet, JoinRowSet, WebRowSet
public interface CachedRowSet extends RowSet, Joinable
Интерфейс, который должны реализовывать все стандартные реализации CachedRowSet.

Справочная реализация интерфейса CachedRowSet от корпорации Oracle является стандартной реализацией. Разработчики могут использовать эту реализацию как есть, расширить её или написать собственную реализацию этого интерфейса.

Объект 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 он будет использовать.

  • Указание имени реализации в конструктор
    Следующая строка кода создаёт объект CachedRowSet crs2 , который инициализирован значениями по умолчанию, за исключением того, что его объект SyncProvider — это заданный объект.
              CachedRowSetImpl crs2 = new CachedRowSetImpl(
                                     "com.fred.providers.HighAvailabilityProvider");
         
  • Установка объекта SyncProvider с помощью метода CachedRowSet setSyncProvider
    Следующая строка кода сбрасывает объект 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 для создания подключения, ему нужно установить свойство для JDBC URL, идентифицирующего соответствующий драйвер, и ему нужно установить свойства для имени пользователя и пароля. Если же набор строк использует объект DataSource для создания подключения, что является предпочтительным методом, ему не нужно устанавливать свойство для JDBC URL. Вместо этого ему нужно установить свойства для логического имени источника данных, имени пользователя и пароля.

ПРИМЕЧАНИЕ: Для использования объекта 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 Paginация данных

Поскольку объект CachedRowSet хранит данные в памяти, количество данных, которое он может содержать в любой момент времени, определяется доступным объемом памяти. Чтобы обойти это ограничение, объект CachedRowSet может извлекать данные из объекта ResultSet в блоках данных, называемых страницами. Чтобы воспользоваться этим механизмом, приложение устанавливает количество строк, которое должно быть включено в страницу, с помощью метода setPageSize. Другими словами, если размер страницы установлен в пять, блок из пяти строк данных будет извлечен из источника данных за один раз. Приложение также может необязательно установить максимальное количество строк, которые могут быть извлечены за один раз. Если максимальное количество строк установлено в ноль или максимальное количество строк не установлено, нет ограничения на количество строк, которое может быть извлечено за один раз.

После установки свойств объект CachedRowSet должен быть заполнен данными с помощью метода populate или метода execute. Следующие строки кода демонстрируют использование метода populate. Обратите внимание, что эта версия метода принимает два параметра: обработчик ResultSet и строку в объекте ResultSet , начиная с которой необходимо извлекать строки.

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setMaxRows(20);
     crs.setPageSize(4);
     crs.populate(rsHandle, 10);
 
Когда этот код выполняется, crs
будет заполнен четырьмя строками из rsHandle, начиная с десятой строки.

Следующий фрагмент кода демонстрирует заполнение объекта CachedRowSet с помощью метода execute, который может или не может принимать объект Connection в качестве параметра. Этот код передает объекту execute объект conHandle.

Обратите внимание на два отличия между следующим фрагментом кода и предыдущим. Во-первых, метод setMaxRows не вызывается, поэтому нет ограничений на количество строк, которые может содержать crs. (Помните, что crs всегда имеет ограничение на объем данных, который он может хранить в памяти.) Во-вторых, вы не можете передать методу execute номер строки в объекте ResultSet для начала извлечения строк. Этот метод всегда начинает с первой строки.

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setPageSize(5);
     crs.execute(conHandle);
 
После выполнения этого кода, crs будет содержать пять строк данных из объекта ResultSet , созданного командой для crs. Запись для crs будет использовать conHandle для подключения к источнику данных и выполнения команды для crs. Затем приложение может обработать данные в crs так же, как оно обрабатывает данные в любом другом объекте CachedRowSet.

Для доступа к следующей странице (части данных) приложение вызывает метод nextPage. Этот метод создает новый объект CachedRowSet и заполняет его следующей частью данных. Например, предположим, что команда объекта CachedRowSet возвращает объект 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
         }
     }
 
Since:
1.5

Краткое описание полей

Modifier and Type Field Description
static final boolean COMMIT_ON_ACCEPT_CHANGES
Deprecated.
Поскольку это поле 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(Connection con)
Распространяет все изменения строк (обновление, вставка и удаление) в источник данных, поддерживающий этот объект CachedRowSet, используя указанный объект Connection для установления соединения с источником данных.
boolean columnUpdated(int idx)
Указывает, была ли обновлена указанная колонка в текущей строке этого объекта CachedRowSet.
boolean columnUpdated(String columnName)
Указывает, была ли обновлена указанная колонка в текущей строке этого объекта CachedRowSet.
void commit()
Свойство SyncProvider каждого объекта CachedRowSet содержит объект Connection из ResultSet или JDBC свойств, переданных в его конструкторы.
CachedRowSet createCopy()
Создаёт объект RowSet, представляющий собой глубокую копию данных в этом объекте CachedRowSet.
CachedRowSet createCopyNoConstraints()
Создаёт объект CachedRowSet, представляющий собой глубокую копию данных этого объекта CachedRowSet, но независимый от него.
CachedRowSet createCopySchema()
Создаёт пустую копию объекта CachedRowSet этого объекта CachedRowSet.
RowSet createShared()
Возвращает новый объект RowSet с той же базой данных, что и этот объект CachedRowSet.
void execute(Connection conn)
Заполняет этот объект 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(ResultSet data)
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet.
void populate(ResultSet rs, int startRow)
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet.
boolean previousPage()
Уменьшает текущую страницу объекта CachedRowSet.
void release()
Освобождает текущее содержимое этого объекта CachedRowSet и отправляет событие rowSetChanged всем зарегистрированным слушателям.
void restoreOriginal()
Восстанавливает этот объект CachedRowSet до его первоначального значения, т.е. значения до последнего набора изменений.
void rollback()
Свойство SyncProvider каждого объекта CachedRowSet содержит объект Connection из исходных ResultSet или JDBC свойств, переданных в него.
void rollback(Savepoint s)
Свойство SyncProvider каждого объекта CachedRowSet содержит объект Connection из исходных ResultSet или JDBC свойств, переданных в него.
void rowSetPopulated(RowSetEvent event, int numRows)
Уведомляет зарегистрированных слушателей о том, что объект RowSet в заданном объекте RowSetEvent заполнил несколько дополнительных строк.
void setKeyColumns(int[] keys)
Устанавливает поле keyCols этого объекта CachedRowSet с заданным массивом номеров столбцов, который образует ключ для уникальной идентификации строки в этом объекте CachedRowSet.
void setMetaData(RowSetMetaData md)
Устанавливает метаданные для этого объекта CachedRowSet с помощью заданного объекта RowSetMetaData.
void setOriginalRow()
Устанавливает текущую строку в этом объекте CachedRowSet как исходную строку.
void setPageSize(int size)
Устанавливает размер страницы объекта CachedRowSet.
void setShowDeleted(boolean b)
Устанавливает свойство showDeleted заданному значению boolean, которое определяет, отображаются ли строки, помеченные для удаления, в наборе текущих строк.
void setSyncProvider(String provider)
Устанавливает объект SyncProvider для этого объекта CachedRowSet в указанный.
void setTableName(String tabName)
Устанавливает идентификатор таблицы, из которой был получен этот объект CachedRowSet, в заданное имя таблицы.
int size()
Возвращает количество строк в этом объекте CachedRowSet.
Collection<?> toCollection()
Преобразует этот объект CachedRowSet в объект Collection, содержащий все данные этого объекта CachedRowSet.
Collection<?> toCollection(int column)
Преобразует указанный столбец в этом объекте CachedRowSet в объект Collection.
Collection<?> toCollection(String column)
Преобразует указанный столбец в этом объекте 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
Устаревшее.
Поскольку это поле является final (оно является частью интерфейса), его значение изменить нельзя.
Вызывает метод SyncProvider объекта CachedRowSet для фиксации изменений при вызове 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 в соответствии с ситуацией.

Parameters:
con - стандартный JDBC Connection объект
Throws:
SyncProviderException - если внутренний поставщик синхронизации не может записать обновления обратно в источник данных
See Also:
  • acceptChanges()
  • RowSetWriter
  • SyncFactory
  • SyncProvider
  • SyncProviderException
  • SyncResolver

restoreOriginal

void restoreOriginal() throws SQLException
Восстанавливает этот CachedRowSet объект до его исходного значения, то есть до значения перед последним набором изменений. Если изменений в наборе строк не было или было только одно изменение, исходное значение - это значение, с которым этот CachedRowSet объект был заполнен; в противном случае - значение, которое он имел непосредственно перед своим текущим значением.

При вызове этого метода реализация CachedRowSet должна гарантировать, что все обновления, вставки и удаления в текущем экземпляре набора строк заменены предыдущими значениями. Кроме того, курсор должен быть сброшен к первой строке, и должен быть сгенерирован событие rowSetChanged, чтобы уведомить всех зарегистрированных слушателей.

Throws:
SQLException - если произошла ошибка при откате текущего значения этого CachedRowSet объекта к его предыдущему значению
See Also:
  • 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 объекте.

Parameters:
column - объект String, указывающий имя столбца, значения которого должны быть представлены в коллекции
Returns:
объект Collection, содержащий значения, хранящиеся в указанном столбце этого CachedRowSet объекта
Throws:
SQLException - если при генерации коллекции произошла ошибка или предоставлен недопустимый идентификатор столбца
See Also:
  • 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, включая информацию о поставщике, версии, идентификаторе поставщика, степени синхронизации и блокировках, которые он в настоящее время установил.

Returns:
объект SyncProvider, установленный при создании набора строк, или, если он не был установлен, поставщик по умолчанию
Throws:
SQLException - если при возвращении объекта SyncProvider произошла ошибка
See Also:
  • setSyncProvider(java.lang.String)

setSyncProvider

void setSyncProvider(String provider) throws SQLException
Устанавливает объект SyncProvider для этого объекта CachedRowSet на указанный. Этот метод позволяет сбросить объект SyncProvider.

Реализация CachedRowSet всегда должна быть инициализирована с доступным механизмом SyncProvider, но есть случаи, когда сброс объекта SyncProvider желателен или необходим. Например, приложение может временно использовать объект поставщика SyncProvider по умолчанию, а затем выбрать поставщика, который стал доступен позже и лучше соответствует его потребностям.

Сброс объекта SyncProvider заставляет объект RowSet запросить новую реализацию SyncProvider у SyncFactory. Это приводит к сбросу всех предыдущих соединений и отношений с исходным источником данных и потенциально может значительно изменить поведение синхронизации отключенного набора строк.

Parameters:
provider - объект String, содержащий полное имя класса реализации SyncProvider
Throws:
SQLException - если при попытке сбросить реализацию SyncProvider произошла ошибка
See Also:
  • getSyncProvider()

size

int size()
Возвращает количество строк в этом CachedRowSet объекте.
Returns:
количество строк в наборе строк

setMetaData

void setMetaData(RowSetMetaData md) throws SQLException
Устанавливает метаданные для этого CachedRowSet объекта с помощью указанного объекта RowSetMetaData. Когда объект RowSetReader считывает содержимое набора строк, он создает объект RowSetMetaData и инициализирует его с помощью методов реализации RowSetMetaData. Реализация по умолчанию использует класс RowSetMetaDataImpl. Когда обработчик закончил чтение содержимого набора строк, этот метод вызывается внутри для передачи объекта RowSetMetaData в набор строк.
Parameters:
md - объект RowSetMetaData, содержащий метаданные о столбцах в этом CachedRowSet объекте
Throws:
SQLException - если в набор строк переданы некорректные метаданные

getOriginal

ResultSet getOriginal() throws SQLException
Возвращает объект ResultSet содержащий исходное значение этого объекта CachedRowSet.

Курсор объекта ResultSet должен быть расположен перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:

  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.CONCUR_UPDATABLE

Исходное значение для объекта RowSet — это значение, которое он имел до последней синхронизации со связанным источником данных. Если синхронизаций не было, исходное значение будет совпадать со значением, с которым объект RowSet был заполнен. Этот метод вызывается внутренне, когда приложение вызывает метод acceptChanges, и объект SyncProvider реализует проверку конфликтов. В этом случае писатель сравнивает исходное значение со значением, текущим в источнике данных, чтобы проверить наличие конфликтов.

Возвращает:
объект ResultSet , содержащий исходное значение для этого объекта CachedRowSet
Исключения:
SQLException - если произошла ошибка при создании объекта ResultSet

getOriginalRow

ResultSet getOriginalRow() throws SQLException
Возвращает объект ResultSet , содержащий исходное значение только для текущей строки этого объекта CachedRowSet.

Курсор объекта ResultSet должен быть расположен перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:

  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.CONCUR_UPDATABLE
Возвращает:
исходный набор результатов для строки
Исключения:
SQLException - если текущей строки нет
См. также:
  • setOriginalRow()

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, удалённые строки отображаются вместе с текущими строками. Если возвращается 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() с момента предыдущего подтверждения/отмены, постоянными. Этот метод следует использовать только при отключённом автоматическом подтверждении.

Бросает:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения
См. также:
  • Connection.setAutoCommit(boolean)

rollback

void rollback() throws SQLException
Каждый объект CachedRowSet содержит объект Connection из исходных свойств ResultSet или JDBC, переданных в него.

Отменяет все изменения, внесённые в текущей транзакции. Этот метод следует использовать только при отключённом автоматическом подтверждении.

Бросает:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения.

rollback

void rollback(Savepoint s) throws SQLException
Каждый объект CachedRowSet содержит объект SyncProvider из исходных свойств ResultSet или JDBC, переданных в него.

Отменяет все изменения, внесённые в текущей транзакции, до последней метки транзакции Savepoint. Этот метод следует использовать только при отключённом автоматическом подтверждении.

Параметры:
s - Метка транзакции Savepoint
Бросает:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения.

rowSetPopulated

void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
Уведомляет зарегистрированных слушателей о том, что объект RowSet в переданном объекте RowSetEvent заполнил несколько дополнительных строк. Параметр numRows гарантирует, что это событие будет срабатывать только через numRow.
Параметры:
event - объект RowSetEvent, содержащий объект RowSet, являющийся источником событий
numRows - интервал строк при заполнении, через который должно срабатывать событие CachedRowSet populated; значение по умолчанию равно нулю; не может быть меньше 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.

Parameters:
startRow - позиция в ResultSet, с которой следует начать заполнение записей в этом CachedRowSet
rs - объект ResultSet, содержащий данные для чтения в этот объект CachedRowSet
Throws:
SQLException - если предоставлен нулевой объект ResultSet или этот объект CachedRowSet не может получить связанный объект ResultSetMetaData
See Also:
  • execute(java.sql.Connection)
  • populate(ResultSet)
  • ResultSet
  • ResultSetMetaData

setPageSize

void setPageSize(int size) throws SQLException
Устанавливает размер страницы для объекта CachedRowSet. Объект CachedRowSet может быть настроен на заполнение себя страницами записей размером в пакет. При вызове методов 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 извлечь следующие строки размера страницы и заполнить RowSet, если оставшиеся строки остаются в рамках исходного SQL-запроса, используемого для заполнения RowSet.
Returns:
true, если существуют другие страницы; false, если это последняя страница
Throws:
SQLException - если при извлечении следующей страницы произошла ошибка или если этот метод вызывается преждевременно до populate или execute.

previousPage

boolean previousPage() throws SQLException
Уменьшает текущую страницу CachedRowSet. Это заставляет реализацию CachedRowSet извлечь предыдущие строки размера страницы и заполнить RowSet. Количество строк, возвращаемых на предыдущей странице, всегда должно оставаться в рамках исходного SQL-запроса, используемого для заполнения RowSet.
Returns:
true, если предыдущая страница успешно извлечена; false, если это первая страница.
Throws:
SQLException - если при извлечении предыдущей страницы произошла ошибка или если этот метод вызывается преждевременно до populate или execute.

© 1993, 2021, 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/17/docs/api/java.sql.rowset/javax/sql/rowset/CachedRowSet.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API