JDBC 3.0(JDK 5.0)引入 javax.sql.rowset.WebRowSet,其繼承層次為:
ResultSet → RowSet → CachedRowSet → WebRowSet → JoinRowSet
Sun 參考實作 com.sun.rowset.WebRowSetImpl 隨 JDK 5.0 釋出,開箱即用。
Eclipse 3.1 + JDK 5.0 + Oracle 10.2,測試表 student(id, fname, lname, age)。
Connection con = ds.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from student");
// 遍歷輸出...
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs); // 將 ResultSet 資料填入 WebRowSet
wrs.writeXML(new FileOutputStream("student.xml"));
產生符合 webrowset.xsd 的標準 XML,包含三大區塊:
<webrowset xmlns="https://java.sun.com/xml/ns/jdbc">
<properties>...</properties>
<metadata>...</metadata>
<data>
<currentRow>
<columnValue>200</columnValue>
<columnValue>Jack</columnValue>
<columnValue>Dakota</columnValue>
<columnValue>21</columnValue>
</currentRow>
...
</data>
</webrowset>
wrs.absolute(1); // 移動至第一列
wrs.deleteRow(); // 標記刪除
wrs.absolute(2); // 移動至第二列
wrs.updateInt(4, 20); // 更新第 4 欄為 20
// XML 輸出將包含 <deleteRow/> 與 <updateValue> 標記
wrs.acceptChanges(); // 將離線變更同步回資料庫
WebRowSet wrs = new WebRowSetImpl();
wrs.readXML(new FileInputStream("student.xml")); // 從 XML 還原
wrs.acceptChanges(); // 寫入資料庫
適用於:外部系統以 XML 傳遞資料,需持久化至資料庫的場景。
| 優點 | 缺點 |
|---|---|
|
|
Java EE 應用使用 JMS 進行外部系統整合,內部用 JDBC 管理事務狀態。WebRowSet 可直接將 JMS 訊息(XML)與資料庫操作無縫銜接,減少轉換層程式碼。
Controller 獲取資料 → WebRowSet 轉 XML → XSLT 轉換為 HTML/PDF/CSV → View 渲染。此架構將資料存取、格式轉換、視覺呈現三層完全分離,維護性極佳。
利用 CachedRowSet 序列化特性,WebRowSet 可作為離線資料容器,支援本地編輯、衝突檢測、線上同步。
WebRowSet 以標準化 XML 雙向轉換為核心差異化能力,填補了 JDBC 與 XML 世界的鴻溝。對於採用 RDBMS 持久化且大量涉及 XML 互操作(Web Services、報表匯出、異構系統整合)的企業級應用,WebRowSet 能顯著簡化架構、減少樣板程式碼、提升系統彈性。雖非萬能藥(大資料量、高併發寫入場景需謹慎),但在「資料為中心、XML 為介面」的現代企業架構中,WebRowSet 是不可或缺的利器。下一個專案若仍沿用傳統 ResultSet → List<Map> → XML 手工轉換模式,不妨嘗試 WebRowSet,或許能讓你耳目一新。