首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 4.0 操作 XML 類型數據完整教程

     編輯:Java 相關知識

背景與意義

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 模型。

核心 API 概覽

寫入 XML 數據

  1. 調用 Connection.createSQLXML() 獲取 SQLXML 實例
  2. 通過 setString()、setCharacterStream()、setBinaryStream() 或 setResult(Result.class)(如 DOMResult、JAXBResult、SAXResult)寫入 XML 內容
  3. 用 PreparedStatement.setSQLXML(index, sqlxml) 綁定參數執行

讀取 XML 數據

  1. ResultSet.getSQLXML(column) 獲取 SQLXML
  2. 通過 getString()、getCharacterStream()、getBinaryStream() 獲取文本/流
  3. 或調用 getSource(Source.class) 直接獲取 DOMSource、SAXSource 等進行後續處理

完整示例:Apache Derby 10.2(模擬 JDBC 4.0 行為)

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...
}

XPath/XQuery 過濾(SQL/XML 標準)

// 使用 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));

實際應用場景:XML 轉 XHTML

利用 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

注意事項

  • 驅動必須完整實現 JDBC 4.0 SQLXML 支援,否則需回退到數據庫特定函數(如 Derby 的 XMLPARSE/XMLSERIALIZE)
  • SQLXML 對象釋放後不可重用,需及時調用 free()
  • 大文檔建議使用流式 API(setBinaryStream/getBinaryStream)避免內存壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved