Spec-Zone .ru
спецификации, руководства, описания, API
|
A WebRowSet
объект является совершенно особым потому что в дополнение к предложению всех возможностей a CachedRowSet
объект, это может записать себя как XML-документ и может также считать тот XML-документ, чтобы преобразовать себя назад в a WebRowSet
объект. Поскольку XML является языком, через который несоизмеримые предприятия могут связаться друг с другом, это стало стандартом для передачи Веб-сервисов. Как следствие, a WebRowSet
объект удовлетворяет реальную потребность, позволяя Веб-сервисам отправить и получить данные от базы данных в форме XML-документа.
Следующие темы затрагиваются:
Компания Перерыва на кофе расширилась до продажи кофе онлайн. Пользователи упорядочивают кофе фунтом от Веб-сайта Перерыва на кофе. Прейскурант регулярно обновляется, получая последнюю информацию от базы данных компании. Этот раздел демонстрирует, как отправить ценовые данные как XML-документ с a 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
таблица и также метаданные об этих двух столбцах.
Записать a WebRowSet
возразите как XML-документ, вызовите метод writeXml
. Читать что содержание XML-документа в a WebRowSet
объект, вызовите метод readXml
. Оба из этих методов делают свою работу в фоновом режиме, означая, что все, кроме результатов, невидимо для Вас.
Метод 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
анализирует 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);
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>
Вы производите изменения в 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>
Выборка WebRowSetSample.java
демонстрирует все функции, описанные на этой странице.