JDBC 4.0(隨 Java SE 6 發布)首次通過 java.sql.SQLXML 接口原生支援 SQL/XML 數據類型(SQL:2003 標準)。主流數據庫(Oracle、DB2、SQL Server)已支援 XML 列,JDBC 4.0 讓 Java 應用無需手動轉換即可高效讀寫 XML 數據,並可直接獲取 DOM/SAX/StAX/JAXB 等標準 XML 模型。
Connection.createSQLXML() 獲取 SQLXML 實例setString()、setCharacterStream()、setBinaryStream() 或 setResult(Result.class)(如 DOMResult、JAXBResult、SAXResult)寫入 XML 內容PreparedStatement.setSQLXML(index, sqlxml) 綁定參數執行ResultSet.getSQLXML(column) 獲取 SQLXMLgetString()、getCharacterStream()、getBinaryStream() 獲取文本/流getSource(Source.class) 直接獲取 DOMSource、SAXSource 等進行後續處理Derby 10.2 雖不直接支援 SQLXML,但兼容 SQL:2003,可用 XMLPARSE、XMLSERIALIZE、XMLEXISTS 等函數演示完整流程。
// 建表
Statement s = c.createStatement();
s.execute("CREATE TABLE ARTICLE(ID INTEGER, DATA XML)");
// 插入(Derby 方式:綁定 CLOB 再 XMLPARSE)
PreparedStatement ps = c.prepareStatement(
"INSERT INTO ARTICLE (ID, DATA) VALUES (?, XMLPARSE (DOCUMENT CAST (? AS CLOB) PRESERVE WHITESPACE))");
ps.setInt(1, id++);
ps.setClob(2, new StringReader(xmlString));
ps.executeUpdate();
// 標準 JDBC 4.0 寫法(需驅動支援)
SQLXML article = c.createSQLXML();
Writer w = article.setCharacterStream();
w.write(xmlString);
w.close();
ps = c.prepareStatement("INSERT INTO ARTICLE (ID, DATA) VALUES (?, ?)");
ps.setInt(1, id++);
ps.setSQLXML(2, article);
// Derby 方式:序列化為 CLOB 再讀取
ResultSet rs = s.executeQuery("SELECT XMLSERIALIZE (DATA AS CLOB) FROM ARTICLE WHERE ID = 2");
while (rs.next()) System.out.println(rs.getString(1));
// 標準 JDBC 4.0 方式:直接獲取 DOM
PreparedStatement st = c.prepareStatement("SELECT ID, DATA FROM ARTICLE");
ResultSet rs = st.executeQuery();
while (rs.next()) {
SQLXML article = rs.getSQLXML("DATA");
InputStream is = article.getBinaryStream();
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
// 進一步處理 doc...
}
// 使用 XMLEXISTS 過濾作者為 John Smith 的文章
Statement s = c.createStatement();
ResultSet rs = s.executeQuery(
"SELECT ID FROM ARTICLE WHERE " +
"XMLEXISTS('//author[text()=\"John Smith\"]' PASSING BY REF DATA)");
while (rs.next()) System.out.println("ID: " + rs.getInt(1));
利用 SQLXML.getSource() 直接作為 XSLT 轉換源:
File xsltFile = new File("transformer.xslt");
File xhtmlFile = new File("output.xhtml");
Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
Source source = sqlxml.getSource(null); // 直接獲取 XML Source
Result result = new StreamResult(xhtmlFile);
xslt.transform(source, result); // 完成 XML → XHTML
SQLXML 支援,否則需回退到數據庫特定函數(如 Derby 的 XMLPARSE/XMLSERIALIZE)SQLXML 對象釋放後不可重用,需及時調用 free()setBinaryStream/getBinaryStream)避免內存壓力