使用 SQLXML 对象
Connection
interface支持使用createSQLXML
方法创建SQLXML
个对象。创建的对象不包含任何数据。可以通过在SQLXML
interface上调用setString
,setBinaryStream
,setCharacterStream
或setResult
方法将数据添加到对象。
涵盖以下主题:
创建 SQLXML 对象
在以下摘录中,方法Connection.createSQLXML
用于创建一个空的SQLXML
对象。 SQLXML.setString
方法用于将数据写入创建的SQLXML
对象。
Connection con = DriverManager.getConnection(url, props);
SQLXML xmlVal = con.createSQLXML();
xmlVal.setString(val);
检索 ResultSet 中的 SQLXML 值
SQLXML
数据类型的处理方式与更原始的内置类型类似。可以通过在ResultSet
或CallableStatement
interface中调用getSQLXML
方法来检索SQLXML
值。
例如,以下摘录从ResultSet
rs 的第一列中检索SQLXML
值:
SQLXML xmlVar = rs.getSQLXML(1);
SQLXML
对象至少在创建它们的事务期间保持有效,除非调用了它们的free
方法。
访问 SQLXML 对象数据
SQLXML
interface提供getString
,getBinaryStream
,getCharacterStream
和getSource
方法以访问其内部内容。以下摘录使用getString
方法检索SQLXML
对象的内容:
SQLXML xmlVal= rs.getSQLXML(1);
String val = xmlVal.getString();
getBinaryStream
或getCharacterStream
方法可用于获取可以直接传递到 XML 解析器的InputStream
或Reader
对象。以下摘录从SQLXML
对象获得InputStream
对象,然后使用 DOM(文档对象模型)解析器处理流:
SQLXML sqlxml = rs.getSQLXML(column);
InputStream binaryStream = sqlxml.getBinaryStream();
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document result = parser.parse(binaryStream);
getSource
方法返回javax.xml.transform.Source
对象。源用作 XML 解析器和 XSLT 转换器的 Importing。
以下摘录使用通过调用getSource
方法返回的SAXSource
对象从SQLXML
对象检索并解析数据:
SQLXML xmlVal= rs.getSQLXML(1);
SAXSource saxSource = sqlxml.getSource(SAXSource.class);
XMLReader xmlReader = saxSource.getXMLReader();
xmlReader.setContentHandler(myHandler);
xmlReader.parse(saxSource.getInputSource());
存储 SQLXML 对象
就像其他数据类型一样,SQLXML
对象可以作为 Importing 参数传递给PreparedStatement
对象。方法setSQLXML
用SQLXML
对象设置指定的PreparedStatement
参数。
在以下摘录中,authorData
是java.sql.SQLXML
interface的实例,该interface的数据先前已初始化。
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO bio " +
"(xmlData, authId) VALUES (?, ?)");
pstmt.setSQLXML(1, authorData);
pstmt.setInt(2, authorId);
updateSQLXML
方法可用于更新可更新结果集中的列值。
如果在调用setSQLXML
或updateSQLXML
之前尚未关闭SQLXML
对象的java.xml.transform.Result
,Writer
或OutputStream
对象,则将引发SQLException
。
初始化 SQLXML 对象
SQLXML
interface提供方法setString
,setBinaryStream
,setCharacterStream
或setResult
来初始化已通过调用Connection.createSQLXML
方法创建的SQLXML
对象的内容。
以下摘录使用方法setResult
返回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
方法来获取java.io.Writer
对象,以便初始化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
方法可用于初始化SQLXML
对象。
如果try在先前已初始化的SQLXML
对象上调用setString
,setBinaryStream
,setCharacterStream
和setResult
方法,则将抛出SQLException
。如果对于同一个SQLXML
对象发生了对方法setBinaryStream
,setCharacterStream
和setResult
的多次调用,则抛出SQLException
且先前返回的javax.xml.transform.Result
,Writer
或OutputStream
对象不受影响。
释放 SQLXML 资源
SQLXML
对象至少在创建它们的 Transaction 期间保持有效。在 Long 期运行的事务中,这可能导致应用程序资源不足。应用程序可以通过调用free
方法来释放SQLXML
资源。
在以下摘录中,调用method SQLXML.free
以释放为先前创建的SQLXML
对象保留的资源。
SQLXML xmlVar = con.createSQLXML();
xmlVar.setString(val);
xmlVar.free();
Sample Code
MySQL 和 Java DB 及其各自的 JDBC 驱动程序不完全支持本节中介绍的SQLXML
JDBC 数据类型。但是,samplesRSSFeedsTable
演示了如何使用 MySQL 和 Java DB 处理 XML 数据。
The Coffee Break 的所有者关注着来自各种网站的一些 RSS 提要,这些提要涵盖了餐饮业的新闻。 RSS(true 简单的联合组织或富网站摘要)提要是一个 XML 文档,其中包含一系列文章和相关的元数据,例如每篇文章的发布日期和作者。所有者希望将这些 RSS 提要存储到数据库表中,其中包括 The Coffee Break 博客中的 RSS 提要。
文件rss-the-coffee-break-blog.xml
是 The Coffee Break 博客的 RSS 提要示例。
在 MySQL 中使用 XML 数据
samplesRSSFeedsTable
将 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
类型的列中,该列是CLOB
SQL 数据类型。 MySQL 有四种CLOB
数据类型。 LONGTEXT
数据类型在这四个字符中包含最多的字符。
方法RSSFeedsTable.addRSSFeed
将 RSS 提要添加到RSS_FEEDS
表中。此方法的第一条语句将 RSS feed(在此示例中由 XML 文件表示)转换为org.w3c.dom.Document
类型的对象,该对象表示 DOM(文档对象模型)文档。此类以及包javax.xml
中包含的类和interface,包含使您能够处理 XML 数据内容的方法。例如,以下语句使用 XPath 表达式从Document
对象检索 RSS feed 的标题:
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
的内容。对于每一行,该方法创建一个名为doc
的类型org.w3c.dom.Document
的对象,该对象将 XML 内容存储在RSS_FEED_XML
列中。该方法检索 XML 内容并将其存储在名为rssFeedXML
的SQLXML
类型的对象中。 rssFeedXML
的内容被解析并存储在doc
对象中。
在 Java DB 中使用 XML 数据
注意 :有关在 Java DB 中使用 XML 数据的更多信息,请参见Java DB 开发人员指南中的“ XML 数据类型和运算符”部分。
samplesRSSFeedsTable
将 RSS 提要存储在表RSS_FEEDS
中,该表是通过以下命令创建的:
create table RSS_FEEDS
(RSS_NAME varchar(32) NOT NULL,
RSS_FEED_XML xml NOT NULL,
PRIMARY KEY (RSS_NAME));
Java DB 支持 XML 数据类型,但不支持SQLXML
JDBC 数据类型。因此,您必须将任何 XML 数据转换为字符格式,然后使用 Java DB 运算符XMLPARSE
将其转换为 XML 数据类型。
RSSFeedsTable.addRSSFeed
方法将 RSS 提要添加到RSS_FEEDS
表中。此方法的第一条语句将 RSS feed(在此示例中由 XML 文件表示)转换为org.w3c.dom.Document
类型的对象。 在 MySQL 中使用 XML 数据部分对此进行了描述。
RSSFeedsTable.addRSSFeed
方法使用JDBCTutorialUtilities.convertDocumentToString
方法将 RSS feed 转换为String
对象。
Java DB 具有一个名为XMLPARSE
的运算符,该运算符将字符串 表示形式解析为 Java DB XML 值,以下摘录演示了这一点:
String insertRowQuery =
"insert into RSS_FEEDS " +
"(RSS_NAME, RSS_FEED_XML) values " +
"(?, xmlparse(document cast " +
"(? as clob) preserve whitespace))";
XMLPARSE
运算符要求您将 XML 文档的字符表示形式转换为 Java DB 可以识别的字符串 数据类型。在此示例中,它将其转换为CLOB
数据类型。有关 Apache Xalan 和 Java DB 要求的更多信息,请参见Getting Started和 Java DB 文档。
方法RSSFeedsTable.viewTable
检索RSS_FEEDS
的内容。由于 Java DB 不支持 JDBC 数据类型SQLXML
,因此必须将 XML 内容作为字符串 检索。 Java DB 有一个名为XMLSERIALIZE
的运算符,该运算符将 XML 类型转换为字符类型:
String query =
"select RSS_NAME, " +
"xmlserialize " +
"(RSS_FEED_XML as clob) " +
"from RSS_FEEDS";
与XMLPARSE
运算符一样,XMLSERIALIZE
运算符要求在您的 JavaClasspath 中列出 Apache Xalan。