Spec-Zone .ru
спецификации, руководства, описания, API
След: JDBC (ТМ) Доступ к базе данных
Урок: Основы JDBC
Используя Объекты WebRowSet
Домашняя страница > JDBC (ТМ) Доступ к базе данных > Основы JDBC

Используя Объекты WebRowSet

A WebRowSet объект является совершенно особым потому что в дополнение к предложению всех возможностей a CachedRowSet объект, это может записать себя как XML-документ и может также считать тот XML-документ, чтобы преобразовать себя назад в a WebRowSet объект. Поскольку XML является языком, через который несоизмеримые предприятия могут связаться друг с другом, это стало стандартом для передачи Веб-сервисов. Как следствие, a WebRowSet объект удовлетворяет реальную потребность, позволяя Веб-сервисам отправить и получить данные от базы данных в форме XML-документа.

Следующие темы затрагиваются:

Компания Перерыва на кофе расширилась до продажи кофе онлайн. Пользователи упорядочивают кофе фунтом от Веб-сайта Перерыва на кофе. Прейскурант регулярно обновляется, получая последнюю информацию от базы данных компании. Этот раздел демонстрирует, как отправить ценовые данные как XML-документ с a WebRowSet возразите и единственный вызов метода.

Создание и Заполнение Объектов WebRowSet

Вы создаете новое WebRowSet объект с конструктором по умолчанию, определенным в ссылочной реализации, WebRowSetImpl, как показано в следующей строке кода:

WebRowSet priceList = new WebRowSetImpl();

Хотя priceList у объекта еще нет никаких данных, у него есть свойства значения по умолчанию a BaseRowSet объект. SyncProvider объект в первом наборе к RIOptimisticProvider реализация, которая является значением по умолчанию для всех разъединенных RowSet объекты. Однако, WebRowSet реализация сбрасывает SyncProvider объект быть RIXMLProvider реализация.

Можно использовать экземпляр RowSetFactory, который создается из RowSetProvider class, чтобы создать a WebRowSet объект. См. Используя Интерфейс RowSetFactory в Использовании Объектов JdbcRowSet для получения дополнительной информации.

Штаб Перерыва на кофе регулярно отправляет обновления прейскуранта своему веб-сайту. Эта информация о WebRowSet объекты покажут один способ, которым можно отправить последний прейскурант в XML-документе.

Прейскурант состоит из данных в столбцах COF_NAME и PRICE от таблицы COFFEES. Следующий фрагмент кода устанавливает необходимые свойства и заполняет priceList объект с данными прейскуранта:

public void getPriceList(String username, String password) {
    priceList.setCommand("SELECT COF_NAME, PRICE FROM COFFEES");
    priceList.setURL("jdbc:mySubprotocol:myDatabase");
    priceList.setUsername(username);
    priceList.setPassword(password);
    priceList.execute();
    // ...
}

В этой точке, в дополнение к свойствам значения по умолчанию, priceList объект содержит данные в COF_NAME и PRICE столбцы от COFFEES таблица и также метаданные об этих двух столбцах.

Запись и Чтение Объекта WebRowSet к XML

Записать a WebRowSet возразите как XML-документ, вызовите метод writeXml. Читать что содержание XML-документа в a WebRowSet объект, вызовите метод readXml. Оба из этих методов делают свою работу в фоновом режиме, означая, что все, кроме результатов, невидимо для Вас.

Используя writeXml Метод

Метод writeXml записи WebRowSet возразите, что вызвал это как XML-документ, который представляет его текущее состояние. Это пишет этот XML-документ в поток, который Вы передаете к этому. Поток может быть OutputStream объект, такой как a FileOutputStream объект, или a Writer объект, такой как a FileWriter объект. Если Вы передаете метод writeXml OutputStream объект, Вы запишете в байтах, которые могут обработать все типы данных; если Вы передаете это a Writer объект, Вы запишете в символах. Следующий код демонстрирует, как писать WebRowSet объект priceList как XML-документ к FileOutputStream объект oStream:

java.io.FileOutputStream oStream =
    new java.io.FileOutputStream("priceList.xml");
priceList.writeXml(oStream);

Следующий код пишет представление XML-документа priceList к FileWriter объект writer вместо к OutputStream объект. FileWriter class является удобством class для того, чтобы записать символы в файл.

java.io.FileWriter writer =
    new java.io.FileWriter("priceList.xml");
priceList.writeXml(writer);

Другие две версии метода writeXml позвольте Вам заполнять a WebRowSet объект с содержанием a ResultSet объект прежде, чем записать это в поток. В следующей строке кода, метода writeXml читает содержание ResultSet объект rs в priceList возразите и затем запишите priceList к FileOutputStream объект oStream как XML-документ.

priceList.writeXml(rs, oStream);

В следующей строке кода, writeXml methodpopulates priceList с содержанием rs, но это пишет XML-документ в a FileWriter объект вместо к OutputStream объект:

priceList.writeXml(rs, writer);

Используя readXml Метод

Метод readXml анализирует XML-документ, чтобы создать WebRowSet возразите, что XML-документ описывает. Подобный методу writeXml, можно передать readXml InputStream объект или a Reader объект, из которого можно считать XML-документ.

java.io.FileInputStream iStream =
    new java.io.FileInputStream("priceList.xml");
priceList.readXml(iStream);

java.io.FileReader reader = new
    java.io.FileReader("priceList.xml");
priceList.readXml(reader);

Отметьте, что можно считать XML-описание в новое WebRowSet возразите или в то же самое WebRowSet возразите что вызванный writeXml метод. В сценарии, куда информация о прейскуранте отправляется от штаба до Веб-сайта, Вы использовали бы новое WebRowSet объект, как показано в следующих строках кода:

WebRowSet recipient = new WebRowSetImpl();
java.io.FileReader reader =
    new java.io.FileReader("priceList.xml");
recipient.readXml(reader);

Что Находится в XML-документах

RowSet объекты являются больше чем только данные, которые они содержат. У них есть свойства и метаданные об их столбцах также. Поэтому, XML-документ, представляющий a WebRowSet объект включает эту другую информацию в дополнение к своим данным. Далее, данные в XML-документе включают и текущую стоимость и исходные значения. (Вспомните, что исходные значения являются значениями, которые сразу существовали прежде, чем новые изменения к данным были произведены. Эти значения необходимы для того, чтобы проверить, было ли соответствующее значение в базе данных изменено, таким образом создавая конфликт, по которому значение должно быть персистентным: новое значение Вы вставляете RowSet возразите или новое значение, кто-то еще вставил базу данных.)

XML-схема WebRowSet, непосредственно XML-документ, определяет что XML-документ, представляющий a WebRowSet объект будет содержать и также формат, в котором он должен быть представлен. И отправитель и получатель используют эту схему, потому что это говорит отправителя, как записать XML-документ (который представляет WebRowSet объект) и получатель, как проанализировать XML-документ. Поскольку фактическая запись и чтение делаются внутренне реализациями методов writeXml и readXml, Вы, как пользователь, не должны понять то, что находится в документе XML-схемы WebRowSet.

XML-документы содержат элементы и подэлементы в иерархической структуре. Следующее является тремя основными элементами в XML-документе, описывающем a WebRowSet объект:

Теги элемента сигнализируют начало и конец элемента. Например, <properties> тегируйте сигнализирует начало элемента свойств, и </properties> тегируйте сигнализирует его конец. <map/> тег является кратким способом сказать, что подэлемент карты (один из подэлементов в элементе свойств) не был присвоен значение. Следующий демонстрационный интервал использования XML-документов и добавление отступа, чтобы облегчить читать, но те не используются в фактическом XML-документе, где интервал ничего не означает.

Следующие три раздела показывают Вам, что три основных элемента содержат для WebRowSet priceList объект, создаваемый в выборке WebRowSetSample.java.

Свойства

Вызов метода writeXml на priceList объект произвел бы описание XML-документа priceList. Раздел свойств этого XML-документа был бы похож на следующее:

<properties>
  <command>
    select COF_NAME, PRICE from COFFEES
  </command>
  <concurrency>1008</concurrency>
  <datasource><null/></datasource>
  <escape-processing>true</escape-processing>
  <fetch-direction>1000</fetch-direction>
  <fetch-size>0</fetch-size>
  <isolation-level>2</isolation-level>
  <key-columns>
    <column>1</column>
  </key-columns>
  <map>
  </map>
  <max-field-size>0</max-field-size>
  <max-rows>0</max-rows>
  <query-timeout>0</query-timeout>
  <read-only>true</read-only>
  <rowset-type>
    ResultSet.TYPE_SCROLL_INSENSITIVE
  </rowset-type>
  <show-deleted>false</show-deleted>
  <table-name>COFFEES</table-name>
  <url>jdbc:mysql://localhost:3306/testdb</url>
  <sync-provider>
    <sync-provider-name>
      com.sun.rowset.providers.RIOptimisticProvider
    </sync-provider-name>
    <sync-provider-vendor>
      Sun Microsystems Inc.
    </sync-provider-vendor>
    <sync-provider-version>
      1.0
    </sync-provider-version>
    <sync-provider-grade>
      2
    </sync-provider-grade>
    <data-source-lock>1</data-source-lock>
  </sync-provider>
</properties>

Заметьте, что у некоторых свойств нет никакого значения. Например, datasource свойство обозначается с <datasource/> тег, который является кратким способом сказать <datasource></datasource>. Никакое значение не дается потому что url свойство устанавливается. Любые соединения, которые устанавливаются, будут сделаны, используя этот URL JDBC, таким образом, нет DataSource возразите должен быть установлен. Кроме того, username и password свойства не перечисляются, потому что они должны остаться секретными.

Метаданные

Раздел метаданных XML-документа, описывающего a WebRowSet объект содержит информацию о столбцах в этом WebRowSet объект. Следующие шоу, на что этот раздел похож для WebRowSet объект priceList. Поскольку priceList у объекта есть два столбца, XML-документ, описывающий его, имеет два <column-definition> элементы. Каждый <column-definition> у элемента есть подэлементы, дающие информацию об описываемом столбце.

<metadata>
  <column-count>2</column-count>
  <column-definition>
    <column-index>1</column-index>
    <auto-increment>false</auto-increment>
    <case-sensitive>false</case-sensitive>
    <currency>false</currency>
    <nullable>0</nullable>
    <signed>false</signed>
    <searchable>true</searchable>
    <column-display-size>
      32
    </column-display-size>
    <column-label>COF_NAME</column-label>
    <column-name>COF_NAME</column-name>
    <schema-name></schema-name>
    <column-precision>32</column-precision>
    <column-scale>0</column-scale>
    <table-name>coffees</table-name>
    <catalog-name>testdb</catalog-name>
    <column-type>12</column-type>
    <column-type-name>
      VARCHAR
    </column-type-name>
  </column-definition>
  <column-definition>
    <column-index>2</column-index>
    <auto-increment>false</auto-increment>
    <case-sensitive>true</case-sensitive>
    <currency>false</currency>
    <nullable>0</nullable>
    <signed>true</signed>
    <searchable>true</searchable>
    <column-display-size>
      12
    </column-display-size>
    <column-label>PRICE</column-label>
    <column-name>PRICE</column-name>
    <schema-name></schema-name>
    <column-precision>10</column-precision>
    <column-scale>2</column-scale>
    <table-name>coffees</table-name>
    <catalog-name>testdb</catalog-name>
    <column-type>3</column-type>
    <column-type-name>
      DECIMAL
    </column-type-name>
  </column-definition>
</metadata>

От этого раздела метаданных можно видеть, что есть два столбца в каждой строке. Первый столбец COF_NAME, который содержит значения типа VARCHAR. Второй столбец PRICE, который содержит значения типа REAL, и так далее. Отметьте, что типы столбца являются типами данных, используемыми в источнике данных, не вводит язык программирования Java. Получить или обновить значения в COF_NAME столбец, Вы используете методы getString или updateString, и драйвер делает преобразование в VARCHAR введите, как это обычно делает.

Данные

Раздел данных дает значения для каждого столбца в каждой строке a WebRowSet объект. Если Вы заполнили priceList возразите и не производил любые изменения в этом, элемент данных XML-документа будет похож на следующий. В следующем разделе Вы будете видеть, как XML-документ изменяется, когда Вы изменяете данные в priceList объект.

Для каждой строки есть a <currentRow> элемент, и потому что priceList имеет два столбца, каждый <currentRow> элемент содержит два <columnValue> элементы.

<data>
  <currentRow>
    <columnValue>Colombian</columnValue>
    <columnValue>7.99</columnValue>
  </currentRow>
  <currentRow>
    <columnValue>
      Colombian_Decaf
    </columnValue>
    <columnValue>8.99</columnValue>
  </currentRow>
  <currentRow>
    <columnValue>Espresso</columnValue>
    <columnValue>9.99</columnValue>
  </currentRow>
  <currentRow>
    <columnValue>French_Roast</columnValue>
    <columnValue>8.99</columnValue>
  </currentRow>
  <currentRow>
    <columnValue>French_Roast_Decaf</columnValue>
    <columnValue>9.99</columnValue>
  </currentRow>
</data>

Произведение Изменений в Объектах WebRowSet

Вы производите изменения в a WebRowSet возразите тому же самому способу, которым Вы делаете к a CachedRowSet объект. В отличие от a CachedRowSet объект, однако, a WebRowSet объект отслеживает обновления, вставки, и удаления так, чтобы writeXml метод может записать и текущую стоимость и исходные значения. Три раздела, которые следуют, демонстрируют, как производить изменения в данных и показывают что XML-документ, описывающий WebRowSet объект похож после каждого изменения. Вы ничего не должны сделать во всем относительно XML-документа; любое изменение к этому производится автоматически, так же, как с записью и чтением XML-документа.

Вставка Строк

Если владелец цепочки Перерыва на кофе хочет добавить новый кофе к прейскуранту, код мог бы быть похожим на это:

priceList.absolute(3);
priceList.moveToInsertRow();
priceList.updateString(COF_NAME, "Kona");
priceList.updateFloat(PRICE, 8.99f);
priceList.insertRow();
priceList.moveToCurrentRow();

В ссылочной реализации вставка сразу делается после текущей строки. В предыдущем фрагменте кода текущая строка является третьей строкой, таким образом, новая строка была бы добавлена после третьей строки и становиться новой четвертой строкой. Чтобы отразить эту вставку, у XML-документа был бы следующий <insertRow> элемент, добавленный к этому после третьего <currentRow> элемент в <data> элемент.

<insertRow> элемент будет выглядеть подобным следующему.

<insertRow>
  <columnValue>Kona</columnValue>
  <columnValue>8.99</columnValue>
</insertRow>

Удаление Строк

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

priceList.absolute(3); priceList.deleteRow();

Следующий <deleteRow> элемент появится после второй строки в разделе данных XML-документа, указывая, что третья строка была удалена.

<deleteRow>
  <columnValue>Espresso</columnValue>
  <columnValue>9.99</columnValue>
</deleteRow>

Изменение Строк

Владелец далее решает, что цена колумбийского кофе слишком дорога и хочет понизить это к.99 фунт. Следующие кодовые наборы новая цена за колумбийский кофе, который находится в первой строке, к.99 фунт:

priceList.first();
priceList.updateFloat(PRICE, 6.99);

XML-документ отразит это изменение в <updateRow> элемент, который дает новое значение. Значение для первого столбца не изменялось, таким образом есть <updateValue> элемент только для второго столбца:

<currentRow>
  <columnValue>Colombian</columnValue>
  <columnValue>7.99</columnValue>
  <updateRow>6.99</updateRow>
</currentRow>

В этой точке, со вставкой строки, удалением строки, и модификацией строки, XML-документа для priceList объект был бы похож на следующее:

<data>
  <insertRow>
    <columnValue>Kona</columnValue>
    <columnValue>8.99</columnValue>
  </insertRow>
  <currentRow>
    <columnValue>Colombian</columnValue>
    <columnValue>7.99</columnValue>
    <updateRow>6.99</updateRow>
  </currentRow>
  <currentRow>
    <columnValue>
      Colombian_Decaf
    </columnValue>
    <columnValue>8.99</columnValue>
  </currentRow>
  <deleteRow>
    <columnValue>Espresso</columnValue>
    <columnValue>9.99</columnValue>
  </deleteRow>
  <currentRow>
    <columnValue>French_Roast</columnValue>
    <columnValue>8.99</columnValue>
  </currentRow>
  <currentRow>
    <columnValue>
      French_Roast_Decaf
    </columnValue>
    <columnValue>9.99</columnValue>
  </currentRow>
</data>

Пример кода WebRowSet

Выборка WebRowSetSample.java демонстрирует все функции, описанные на этой странице.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Объекты FilteredRowSet
Следующая страница: Используя Усовершенствованные Типы данных