RowSet 繼承 ResultSet,提供離線操作、JavaBeans 支持、可序列化傳輸,是 JDBC 编程的現代化選擇。JDK 5.0 定義 5 大標準接口並提供參考實現,本文系統講解分類、填充、操作、事務、XML/序列化應用。
| 特性 | ResultSet | RowSet |
|---|---|---|
| 連接模式 | 僅連接 | 連接/離線雙模式 |
| 默認屬性 | 只前向、只讀 | 可滾動、可更新、可序列化 |
| JavaBeans | 不支持 | 標準 JavaBeans 組件 |
| 網絡傳輸 | 困難 | 可序列化跨網絡傳輸 |
| 離線編輯 | 不支持 | 斷開修改後同步回數據源 |
| 接口 | 實現類 | 類型 | 核心能力 |
|---|---|---|---|
| JdbcRowSet | JdbcRowSetImpl | 連接 | ResultSet 封裝,作 JavaBeans 用,持續持有連接 |
| CachedRowSet | CachedRowSetImpl | 離線 | 最常用,內存增刪改查,同步回數據源,支持事件/分頁 |
| WebRowSet | WebRowSetImpl | 離線 | 繼承 CachedRowSet,雙向 XML 轉換 |
| FilteredRowSet | FilteredRowSetImpl | 離線 | 通過 Predicate 過濾數據 |
| JoinRowSet | JoinRowSetImpl | 離線 | 類 SQL JOIN 合併多 RowSet(僅支持 Inner Join) |
前四者均繼承 CachedRowSet,形成能力遞增體系。
RowSet rs = new CachedRowSetImpl(); // 或 WebRowSetImpl 等
rs.setUrl("jdbc:mysql:///test");
rs.setUsername("root");
rs.setPassword("");
rs.setCommand("SELECT * FROM EMPLOYEES");
rs.execute(); // 執行查詢並填充
亦可用 setDataSourceName() 查找 JNDI DataSource。
ResultSet jdbcRs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
CachedRowSet crs = new CachedRowSetImpl();
crs.populate(jdbcRs); // 將只前向/只讀 ResultSet 轉為可滾動可更新
WebRowSet wrs = new WebRowSetImpl();
wrs.readXml(new FileReader("D:\\employees.xml")); // 需符合 WebRowSet XML Schema
CSV、Excel、HTTP 等需自行編碼填充。
除繼承 ResultSet 方法外,RowSet 無額外操作 API,核心同 JDBC:
// 更新
rs.absolute(5);
rs.updateInt(1, 10);
rs.updateRow();
// 插入
rs.moveToInsertRow();
rs.updateInt(1, 10);
rs.insertRow();
// 刪除
rs.absolute(5);
rs.deleteRow();
// 參數化查詢
rs.setCommand("SELECT * FROM EMP WHERE ID = ?");
rs.setInt(1, 1);
rs.execute();
// 元數據
RowSetMetaData rsmd = (RowSetMetaData) rs.getMetaData();
int colCount = rsmd.getColumnCount();
int colType = rsmd.getColumnType(2);
commit()/rollback()acceptChanges(),內部由 Writer 同步回數據源CachedRowSet 可序列化,適合:
// 寫 XML
wrs.setCommand("SELECT id, salary, name FROM employees");
wrs.execute();
wrs.writeXml(new FileWriter("D:\\employees.xml"));
// 讀 XML
WebRowSet wrs2 = new WebRowSetImpl();
wrs2.readXml(new FileReader("D:\\employees.xml"));
標準 Schema:https://java.sun.com/xml/ns/jdbc/webrowset.xsd
RowSet 以離線模型、JavaBeans 化、XML 序列化三大特性,解決 ResultSet 連接耦合、不可傳輸、不可離線編輯的痛點。CachedRowSet 是核心,WebRowSet 面向 Web/XML,Filtered/JoinRowSet 提供進階查詢能力。選型原則:默認用 CachedRowSet,需 XML 用 WebRowSet,需過濾/連接用對應實現。