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

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

Connection интерфейс оказывает поддержку для создания SQLXML объекты используя метод createSQLXML. Объект, который создается, не содержит данных. Данные могут быть добавлены к объекту, вызывая setString, setBinaryStream, setCharacterStream или setResult метод на SQLXML интерфейс.

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

Создание Объекты SQLXML

В следующей выборке, методе Connection.createSQLXML используется, чтобы создать пустое SQLXML объект. SQLXML.setString метод используется, чтобы записать данные в SQLXML объект, который создавался.

Connection con = DriverManager.getConnection(url, props);
SQLXML xmlVal = con.createSQLXML();
xmlVal.setString(val);

Получение Значений SQLXML в ResultSet

SQLXML тип данных обрабатывается так же к более примитивным встроенным типам. A SQLXML значение может быть получено, вызывая getSQLXML метод в ResultSet или CallableStatement интерфейс.

Например, следующая выборка получает a SQLXML значение от первого столбца ResultSet РТС:

SQLXML xmlVar = rs.getSQLXML(1);

SQLXML объекты остаются допустимыми для, по крайней мере, продолжительности транзакции, в которой они не создаются, если их free метод вызывается.

Доступ к Данным Объекта SQLXML

SQLXML интерфейс обеспечивает getString, getBinaryStream, getCharacterStream, и getSource методы, чтобы получить доступ к его внутреннему контенту. Следующая выборка получает содержание SQLXML объект используя getString метод:

SQLXML xmlVal= rs.getSQLXML(1);
String val = xmlVal.getString();

getBinaryStream или getCharacterStream методы могут использоваться, чтобы получить InputStream или a Reader объект, который можно передать непосредственно к синтаксическому анализатору XML. Следующая выборка получает InputStream объект от SQLXML Объект и затем обрабатывает поток, используя ДОМА (Объектная модель документа) синтаксический анализатор:

SQLXML sqlxml = rs.getSQLXML(column);
InputStream binaryStream = sqlxml.getBinaryStream();
DocumentBuilder parser = 
    DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document result = parser.parse(binaryStream);

getSource метод возвращает a javax.xml.transform.Source объект. Источники привыкли как входной к синтаксическим анализаторам XML и преобразователям XSLT.

Следующая выборка получает и анализирует данные от a SQLXML объект используя SAXSource объект, возвращенный, вызывая getSource метод:

SQLXML xmlVal= rs.getSQLXML(1);
SAXSource saxSource = sqlxml.getSource(SAXSource.class);
XMLReader xmlReader = saxSource.getXMLReader();
xmlReader.setContentHandler(myHandler);
xmlReader.parse(saxSource.getInputSource());

Хранение Объекты SQLXML

A SQLXML объект можно передать как входной параметр к a PreparedStatement объект точно так же как другие типы данных. Метод setSQLXML устанавливает определяемый PreparedStatement параметр с a SQLXML объект.

В следующей выборке, authorData экземпляр java.sql.SQLXML взаимодействуйте через интерфейс, чьи данные были инициализированы ранее.

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO bio " +
                              "(xmlData, authId) VALUES (?, ?)");
pstmt.setSQLXML(1, authorData);
pstmt.setInt(2, authorId);

updateSQLXML метод может использоваться, чтобы обновить значение столбца в обновляемом наборе результатов.

Если java.xml.transform.Result, Writer, или OutputStream объект для SQLXML объект не был закрыт до вызова setSQLXML или updateSQLXML, a SQLException будет брошен.

Инициализация Объекты SQLXML

SQLXML интерфейс обеспечивает методы setString, setBinaryStream, setCharacterStream, или setResult инициализировать контент для a SQLXML объект, который был создан, вызывая Connection.createSQLXML метод.

Следующая выборка использует метод setResult возвратить a SAXResult объект заполнить недавно создаваемый SQLXML объект:

SQLXML sqlxml = con.createSQLXML();
SAXResult saxResult = sqlxml.setResult(SAXResult.class);
ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
contentHandler.startDocument();
    
// set the XML elements and
// attributes into the result
contentHandler.endDocument();

Следующая выборка использует setCharacterStream метод, чтобы получить a java.io.Writer возразите, чтобы инициализировать a SQLXML объект:

SQLXML sqlxml = con.createSQLXML();
Writer out= sqlxml.setCharacterStream();
BufferedReader in = new BufferedReader(new FileReader("xml/foo.xml"));
String line = null;
while((line = in.readLine() != null) {
    out.write(line);
}

Точно так же SQLXML setString метод может использоваться, чтобы инициализировать a SQLXML объект.

Если попытка предпринимается, чтобы вызвать setString, setBinaryStream, setCharacterStream, и setResult методы на a SQLXML объект, который был ранее инициализирован, a SQLException будет брошен. Если больше чем один призывает к методам setBinaryStream, setCharacterStream, и setResult происходит для того же самого SQLXML объект, a SQLException бросается и ранее возвращенный javax.xml.transform.Result, Writer, или OutputStream на объект не влияют.

Выпуск Ресурсы SQLXML

SQLXML объекты остаются допустимыми для, по крайней мере, продолжительности транзакции, в которой они создаются. Это могло потенциально привести к приложению, исчерпывающему ресурсы во время длинной рабочей транзакции. Приложения могут выпустить SQLXML ресурсы, вызывая их free метод.

В следующей выборке, method SQLXML.free вызывается, чтобы высвободить средства, сохраненные на ранее создаваемый SQLXML объект.

SQLXML xmlVar = con.createSQLXML();
xmlVar.setString(val);
xmlVar.free();

Пример кода

MySQL и DB Java и их соответствующие драйверы JDBC не полностью поддерживают SQLXML Тип данных JDBC как описано на в этом разделе. Однако, выборка RSSFeedsTable демонстрирует, как обработать данные XML с DB Java и MySQL.

Владелец Перерыва на кофе следует за несколькими каналами RSS от различных веб-сайтов, которые покрывают ресторан и отраслевые новости напитка. RSS (Лента новостей или Оперативная сводка новостей) канал является XML-документом, который содержит серию статей и связанных метаданных, таких как дата публикации и автора для каждой статьи. Владелец хотел бы сохранить эти каналы RSS в таблицу базы данных, включая канал RSS из блога Перерыва на кофе.

Файл rss-the-coffee-break-blog.xml канал RSS в качестве примера из блога Перерыва на кофе.

Работа с Данными XML в MySQL

Выборка RSSFeedsTable каналы RSS хранилищ в таблице RSS_FEEDS, который создается со следующей командой:

create table RSS_FEEDS
    (RSS_NAME varchar(32) NOT NULL,
    RSS_FEED_XML longtext NOT NULL,
    PRIMARY KEY (RSS_NAME));

MySQL не поддерживает тип данных XML. Вместо этого эта выборка хранит данные XML в столбце типа LONGTEXT, который является a CLOB Тип данных SQL. MySQL имеет четыре CLOB типы данных; LONGTEXT тип данных содержит самое большое количество символов среди четырех.

Метод RSSFeedsTable.addRSSFeed добавляет канал RSS к RSS_FEEDS таблица. Первые операторы этого метода преобразовывают канал RSS (который представляется XML-файлом в этой выборке) в объект типа org.w3c.dom.Document, который представляет ДОМА (Объектная модель документа) документ. Этот class, наряду с классами и интерфейсами содержится в пакете javax.xml, содержите методы, которые позволяют Вам управлять контентом данных XML. Например, следующий оператор использует выражение XPath, чтобы получить title канала RSS от Document объект:

Node titleElement =
    (Node)xPath.evaluate("/rss/channel/title[1]",
        doc, XPathConstants.NODE);

Выражение XPath /rss/channel/title[1] получает содержание первого <title> элемент. Для файла rss-the-coffee-break-blog.xml, это - строка The Coffee Break Blog.

Следующие операторы добавляют канал RSS к таблице RSS_FEEDS:

// For databases that support the SQLXML
// data type, this creates a
// SQLXML object from
// org.w3c.dom.Document.

System.out.println("Adding XML file " + fileName);
String insertRowQuery =
    "insert into RSS_FEEDS " +
    "(RSS_NAME, RSS_FEED_XML) values " +
    "(?, ?)";
insertRow = con.prepareStatement(insertRowQuery);
insertRow.setString(1, titleString);

System.out.println("Creating SQLXML object with MySQL");
rssData = con.createSQLXML();
System.out.println("Creating DOMResult object");
DOMResult dom = (DOMResult)rssData.setResult(DOMResult.class);
dom.setNode(doc);

insertRow.setSQLXML(2, rssData);
System.out.println("Running executeUpdate()");
insertRow.executeUpdate();

RSSFeedsTable.viewTable метод получает содержание RSS_FEEDS. Для каждой строки метод создает объект типа org.w3c.dom.Document именованный doc в котором можно сохранить контент XML в столбце RSS_FEED_XML. Метод получает контент XML и хранит его в объекте типа SQLXML именованный rssFeedXML. Содержание rssFeedXML анализируются и сохранены в doc объект.

Работа с Данными XML в DB Java

Отметьте: См. раздел "типы данных XML и операторы" в Руководстве разработчика DB Java для получения дополнительной информации о работе с данными XML в DB Java.

Выборка RSSFeedsTable каналы RSS хранилищ в таблице RSS_FEEDS, который создается со следующей командой:

create table RSS_FEEDS
    (RSS_NAME varchar(32) NOT NULL,
    RSS_FEED_XML xml NOT NULL,
    PRIMARY KEY (RSS_NAME));

DB Java поддерживает тип данных XML, но это не поддерживает SQLXML Тип данных JDBC. Следовательно, следует преобразовать любые данные XML в символьный формат, и затем использовать оператор DB Java XMLPARSE преобразовать это в тип данных XML.

RSSFeedsTable.addRSSFeed метод добавляет канал RSS к RSS_FEEDS таблица. Первые операторы этого метода преобразовывают канал RSS (который представляется XML-файлом в этой выборке) в объект типа org.w3c.dom.Document. Это описывается в разделе, Работающем с Данными XML в MySQL.

RSSFeedsTable.addRSSFeed метод преобразовывает канал RSS в a String объект с методом JDBCTutorialUtilities.convertDocumentToString.

DB Java назвали оператор XMLPARSE это анализирует представление символьной строки в значение XML DB Java, которое демонстрируется следующей выборкой:

String insertRowQuery =
    "insert into RSS_FEEDS " +
    "(RSS_NAME, RSS_FEED_XML) values " +
    "(?, xmlparse(document cast " +
    "(? as clob) preserve whitespace))";

XMLPARSE оператор требует, чтобы Вы преобразовали символьное представление XML-документа в строковый тип данных, который распознает DB Java. В этом примере это преобразовывает это в a CLOB тип данных. Кроме того, XMLPARSE оператор требует, чтобы Apache Xalan был перечислен в Вашем Java путь class. См. Начинание и документацию DB Java для получения дополнительной информации о Apache Xalan и требования DB Java.

Метод RSSFeedsTable.viewTable получает содержание RSS_FEEDS. Поскольку DB Java не поддерживает тип данных JDBC SQLXML следует получить контент XML как строку. DB Java назвали оператор XMLSERIALIZE это преобразовывает тип XML в символьный тип:

String query =
    "select RSS_NAME, " +
    "xmlserialize " +
    "(RSS_FEED_XML as clob) " +
    "from RSS_FEEDS";

Как с XMLPARSE оператор, XMLSERIALIZE оператор требует, чтобы Apache Xalan был перечислен в Вашем Java путь class.


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

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