歡迎您光臨本站 註冊首頁

學習如何使用Java中的RowSet

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
RowSet 對象可以建立一個與數據源的連接並在其整個生命周期中維持該連接,在此情況下,該對象被稱為連接的rowset.rowset 還可以建立一個與數據源的連接,從其獲取數據,然後關閉它.這種rowset 被稱為非連接rowset.非連接rowset 可以在斷開時更改其數據,然後將這些更改發送回原始數據源,不過它必須重新建立連接才能完成此操作. 相比較java.sql.ResultSet 而言,RowSet 的離線操作能夠有效的利用計算機越來越充足的內存,減輕資料庫伺服器的負擔,由於數據操作都是在內存中進行然後批量提交到數據源,靈活性和性能都有了很大的提高.RowSet 默認是一個可滾動,可更新,可序列化的結果集,它作為JavaBeans,可以方便地在網路間傳輸,用於兩端的數據同步.

1、填充RowSet

前面說過,應該傾向於把RowSet看成是與資料庫無關而只代表一行行數據的對象,因此就涉及到數據從哪裡來的問題.

(1)從資料庫直接獲取數據

由於大部分情況下,與數據打交道也就是與資料庫打交道,因此RowSet介面提供了通過JDBC直接從資料庫獲取數據的方法,以參考實現JdbcRowSetImpl為例,就是這樣:RowSet rs = new JdbcRowSetImpl(); //也可以是CachedRowSetImpl,WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl,rs.setUrl("jdbc:mysql:///test");rs.setUsername("root");rs.setPassword("");rs.setCommand("SELECT * FROM EMPLOYEES");rs.execute();設置好相關屬性,運行execute()方法后,EMPLOYEES表中的數據就被填充到rs對象中了.除了通過設置JDBC連接URL、用戶名和密碼外,RowSet也可以使用數據源名稱屬性的值來查找已經在命名服務中註冊的DataSource 對象.完成檢索后,可以使用DataSource 對象創建到它所表示的數據源的連接,設置數據源名稱可以使用setDataSourceName()方法.

(2)用ResultSet填充

在有現成ResultSet的情況下,如果想將其作為RowSet使用;或者當DBMS 不提供對滾動和更新的完全支持時,如果想使不可滾動和只讀的ResultSet 對象變得可滾動和可更新,可以創建一個使用該ResultSet 對象的數據所填充的CachedRowSet 對象.ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");CachedRowSet crs = new CachedRowSetImpl(); //也可以是WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl,他們均繼承自CachedRowSetImpl運行populate()方法后,ResultSet對象rs中的數據就被填充到crs對象中了.

(3)用XML填充

如果您打算將XML作為數據交換格式在客戶端和你的伺服器之間傳輸數據並且向實現數據離線編輯、或者向使用XML格式的數據的話,可以使用WebRowSet介面來用XML填充數據.WebRowSet wrs = new WebRowSetImpl();wrs.readXml(new FileReader(new File("D:\\employees.xml"))); 運行readXml()方法后,employees.xml文件的數據就被填充到wrs對象中了.employees.xml 文件的格式參見附錄.



(4)用其他方法填充

如果形用其他方式填充,比如csv、excel、text、http等格式或方法填充數據,那麼就需要自己編寫代碼實現RowSet.

2、事務與更新底層數據源

RowSet本身只代表具體數據,事務以及底層數據源的更新是與底層數據源密切相關的概念.對於JDBC數據源,相應的標準介面JdbcRowSet通過與資料庫相關的方法來來實現,如commit(),rollback()等.對於標準介面的中非連接rowset,如CachedRowSet,則在對RowSet中的數據改動后,通過運行acceptChanges()方法,在內部調用RowSet 對象的writer 將這些更改寫入數據源,從而將CachedRowSet 對象中的更改傳播回底層數據源.

3、與ResultSet比較

(1)RowSet擴展了ResultSet介面,因此可以像使用ResultSet一樣使用RowSet.

(2)RowSet擴展了ResultSet介面,因此功能比ResultSet更多、更豐富.

(3)默認情況下,所有RowSet 對象都是可滾動的和可更新的.而ResultSet是只能向前滾動和只讀的.

(4)RowSet可以是非鏈接的,而ResultSet是連接的.因此利用CacheRowSet介面可以離線操作數據.

(5)RowSet介面添加了對JavaBeans 組件模型的JDBC API 支持.rowset 可用作可視化Bean 開發環境中的JavaBeans 組件.

4、操作RowSet中的數據及元數據

除了ResultSet提供的操作數據和元數據方法外,RowSet介面沒有提供太多額外的方法.

(1)更新數據

rs.absolute(5);

rs.updateInt(1, 10);

rs.updateRow();

(2)插入數據

rs.moveToInsertRow();

rs.updateInt(1, 10);

rs.insertRow();

(3)刪除數據

rs.absolute(5);

rs.deleteRow();

(4)設置屬性

rs.setCommand("select id, salary, name from employees where id = ?");

rs.setInt(1, 1);

rs.execute();

(5)元數據

RowSetMetaData rsmd = (RowSetMetaData)rs.getMetaData();

int count = rsmd.getColumnCount();

int type = rsmd.getColumnType(2);

5、JDK 5.0 的5個標準RowSet介面

在JDK 5.0中,5個標準RowSet介面包括CachedRowSet,WebRowSet,FilteredRowSet,JoinRowSet 和JdbcRowSet.相應的參考實現是Sun公司給出的,位於com.sun.rowset包下,分別為為CachedRowSetImpl,WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl 和JdbcRowSetImpl.這5個標準介面中JdbcRowSet是鏈接的rowset,而其他4個是非鏈接的rowset.

(1)CachedRowSet:最常用的一種RowSet.其他三種RowSet(WebRowSet,FilteredRowSet,JoinRowSet)都是直接或間接繼承於它並進行了擴展.它提供了對資料庫的離線操作,可以將數據讀取到內存中進行增刪改查,再同步到數據源.CachedRowSet是可滾動的、可更新的、可序列化,可作為JavaBeans 在網路間傳輸.支持事件監聽,分頁等特性.CachedRowSet 對象通常包含取自結果集的多個行,但是也可包含任何取自表格式文件(如電子表格)的行.



(2)WebRowSet:繼承自CachedRowSet,並可以將WebRowSet 寫到XML 文件中,也可以用符合規範的XML 文件來填充WebRowSet.

(3)FilteredRowSet:通過設置Predicate(在javax.sql.rowset 包中),提供數據過濾的功能.可以根據不同的條件對RowSet 中的數據進行篩選和過濾.

(4)JoinRowSet:提供類似SQL JOIN 的功能,將不同的RowSet 中的數據組合起來.目前在Java 6 中只支持內聯(Inner Join).

(5)JdbcRowSet:對ResultSet 的一個封裝,使其能夠作為JavaBeans 被使用,是唯一一個保持資料庫連接的RowSet.JdbcRowSet 對象是連接的RowSet 對象,也就是說,它必須使用啟用JDBC 技術的驅動程序("JDBC 驅動程序")來持續維持它與數據源的連接.


[火星人 ] 學習如何使用Java中的RowSet已經有746次圍觀

http://coctec.com/docs/java/show-post-59846.html