首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 9 pureXML 實戰:Java 應用開發中的 XML 存儲、查詢與索引

     編輯:DB2 教學

DB2 9 XML 核心能力

  • 原生 XML 類型: 以解析後的分層格式存儲,非 CLOB 文本,支持高效路徑導航。
  • XML 索引: 針對 XML 文檔內部路徑建立索引,大幅提升 XPath/XQuery 查詢性能。
  • 雙查詢語言: SQL/XML(XMLQUERY、XMLEXISTS、XMLTABLE)與 XQuery,Java 中通過 JDBC 統一調用。
  • 模式驗證: 註冊 XML Schema,插入時自動驗證,保證數據質量。
  • 工具鏈: 基於 Eclipse 3.1 的 Developer Workbench,支持可視化 SQL/XQuery 構建、存儲過程生成、調試。

環境準備

  1. Eclipse 切換 Java Perspective → New Project。
  2. Build Path 加入 DB2 驅動 JAR:db2jcc.jar、db2jcc_javax.jar、db2jcc_license_cu.jar(位於 DB2_HOME/java/)。
  3. 可選:創建包組織代碼。

示例表結構

CREATE TABLE CLIENTS (
  ID        INTEGER NOT NULL PRIMARY KEY,
  NAME      VARCHAR(50),
  STATUS    VARCHAR(10),  -- 'Gold', 'Silver'
  CONTACTINFO XML         -- 原生 XML 列
);

XML 文檔範例(存入 CONTACTINFO):

<Client>
  <Address>
    <Street>123 Main St</Street>
    <City>San Jose</City>
    <State>CA</State>
    <Zip>95125</Zip>
  </Address>
  <Phone type="work">408-555-1234</Phone>
  <Phone type="home">408-555-5678</Phone>
  <Email>john.doe@example.com</Email>
  <Email>j.doe@backup.com</Email>
</Client>

插入 XML 數據(從文件流)

public void insertXml(Connection con, File xmlFile) throws Exception {
    String sql = "INSERT INTO CLIENTS (ID, NAME, STATUS, CONTACTINFO) VALUES (?, ?, ?, ?)";
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setInt(1, 1001);
    ps.setString(2, "John Doe");
    ps.setString(3, "Gold");
    try (FileInputStream fis = new FileInputStream(xmlFile)) {
        ps.setBinaryStream(4, fis, (int) xmlFile.length());
        ps.executeUpdate();
    }
    ps.close();
}

關鍵點: 用 setBinaryStream 傳輸 XML,DB2 自動解析存儲。支持 XMLVALIDATE 針對已註冊 Schema 驗證。

查詢 XML:SQL/XML 函數實戰

需求:查詢 Status='Gold' 且 Zip='95125' 的客戶姓名與第一個 Email。

SELECT NAME,
       XMLQUERY('$c/Client/Email[1]' PASSING CONTACTINFO AS "c") AS FIRST_EMAIL
FROM CLIENTS
WHERE STATUS = 'Gold'
  AND XMLEXISTS('$c/Client/Address/Zip[. = $z]'
                PASSING CONTACTINFO AS "c",
                     CAST('95125' AS VARCHAR(5)) AS "z");

語法解析

  • XMLQUERY:提取 XML 片段,返回 XML 類型。XPath $c/Client/Email[1] 取第一個 Email 元素。
  • XMLEXISTS:布爾謂詞,僅返回滿足條件的行。PASSING 綁定 XML 上下文變量 $c 與參數 $z。
  • CAST:確保參數類型匹配。

結果處理

ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
    String name = rs.getString("NAME");
    // XMLQUERY 返回 XML 類型,可用 getBinaryStream/getString 獲取序列化文本
    String emailXml = rs.getString("FIRST_EMAIL");  // 含 <Email> 標籤
    // 若只需文本值:XPath 改為 $c/Client/Email[1]/text()
}

進階特性速覽

特性說明
XML 索引CREATE INDEX IX_ZIP ON CLIENTS(CONTACTINFO) GENERATE KEYS USING XMLPATTERN '/Client/Address/Zip' AS SQL VARCHAR(10)
XMLTABLE將 XML 彈性轉為關係行集,便於 JOIN、BI 工具直接消費
更新/刪除用 XMLMODIFY (XQuery Update Facility) 精確修改片段,或整列替換
存儲過程IBM developerWorks 提供 XMLUPDATE 範例過程,僅傳增量 XML 片段即可更新
事務/並發XML 列遵循標準 ACID,行級鎖粒度同關係列

最佳實踐建議

  • 按需提取: 避免 SELECT CONTACTINFO 拉取整個大文檔,用 XMLQUERY/XMLTABLE 只取所需片段。
  • 建立 XML 索引: 高頻 XPath 路徑(如 /Client/Address/Zip、/Client/Email)必須建索引。
  • Schema 管理: 版本化註冊 Schema,生產環境強制驗證,防止髒數據入庫。
  • 驅動版本: 必須用 JCC Type 4 (db2jcc4.jar) 完整支持 XML 類型流式讀寫。
  • Developer Workbench: 善用 Data Perspective 的 SQL/XQuery Builder 可視化構建複雜查詢,生成 Java 代碼片段。

總結

DB2 9 pureXML 讓 XML 成為一等公民:原生存儲、索引加速、標準語言查詢、JDBC 無縫集成。Java 開發者無需學習新 API,只需掌握 XMLQUERY/XMLEXISTS/XMLTABLE 三大 SQL/XML 函數與 XPath/XQuery 基礎,即可在關係與 XML 混合場景中高效開發。配合 Developer Workbench,開發調試效率再上台階。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved