|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Connection интерфейс оказывает поддержку для создания SQLXML объекты используя метод createSQLXML. Объект, который создается, не содержит данных. Данные могут быть добавлены к объекту, вызывая setString, setBinaryStream, setCharacterStream или setResult метод на SQLXML интерфейс.
Следующие темы затрагиваются:
В следующей выборке, методе Connection.createSQLXML используется, чтобы создать пустое SQLXML объект. SQLXML.setString метод используется, чтобы записать данные в SQLXML объект, который создавался.
Connection con = DriverManager.getConnection(url, props); SQLXML xmlVal = con.createSQLXML(); xmlVal.setString(val);
SQLXML тип данных обрабатывается так же к более примитивным встроенным типам. A SQLXML значение может быть получено, вызывая getSQLXML метод в ResultSet или CallableStatement интерфейс.
Например, следующая выборка получает a SQLXML значение от первого столбца ResultSet РТС:
SQLXML xmlVar = rs.getSQLXML(1);
SQLXML объекты остаются допустимыми для, по крайней мере, продолжительности транзакции, в которой они не создаются, если их free метод вызывается.
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());
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 интерфейс обеспечивает методы 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 ресурсы, вызывая их 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 в качестве примера из блога Перерыва на кофе.
Выборка 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 и операторы" в для получения дополнительной информации о работе с данными 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.