java裡的離線資料集
1前言
聽說在java裡面一直沒有封裝很好的類似dataset的離線資料集,但是java裡面同樣提供了封裝的不好的離線資料集rowset,在早些時候的jdk版本(jdk1.4及以前)其實已經提供了rowset的jar包,但是sun公司只提供了5個介面,並沒有提供介面的實現,而我們要完成我們想要的工作就必須自己寫實現,但同時,由於廣大網友的要求(覺得這樣實在不方便),sun公司又單獨提供了一個有實現的rowset.jar包,放在sun的官方網站上供人們下載和使用,不過在他的sun官方網站上面該jar包的名字是jdbc_rowset_tiger-1_0_1-mrel-jwsdp.zip,在jdk1.5
2準備工作
在使用這個下載的離線資料集包的時候,我們首先要做的一件事就是把他改成中國地區能使用的jar包,因為他提供的這個jar包預設狀態下是英文地區使用的,如果不這樣做的話只要呼叫new CachedRowSetImpl(),就可以建立一個CachedRowSet物件,但就是這個new CachedRowSetImpl(),在使用時程式執行這個語句會丟擲異常。根本用不了。
解決方法:
1解壓jdbc_rowset_tiger-1_0_1-mrel-ri.zip,
2再解壓rowset.jar文件,在產生的com/sun/rowset目錄下找到RowSetResourceBundle.properties檔案。
3將RowSetResourceBundle.properties更名為
RowSetResourceBundle_CN.properties。
4重新建立rowset.jar包說明:這裡_CN表示所處中國。不同的國家,這個名稱不同經過以上的步驟就可以正常使用new CachedRowSetImpl()啦.
3rowset簡介
Java 5在Java Database Connectivity (JDBC)方面加強了支援,其中加入了新的包javax.sql.rowset
1.CachedRowSet: CachedRowset可以不用與資料來源建立長期的連線,只有當從資料庫讀取資料或是往資料庫寫入資料的時候才會與資料庫建立連線,它提供了一種輕量級的訪問資料庫的方式,其資料均存在記憶體中。
2.JdbcRowSet:對ResultSet的物件進行包裝,使得可以將ResultSet物件做為一個JavaBeans ™ 元件。
3.FilteredRowSet:繼承自CachedRowSet,可以根據設定條件得到資料的子集。
4.JoinRowSet:繼承自CachedRowSet,可以將多個RowSet物件進行SQL Join語句的合併。
5.WebRowSet:繼承自CachedRowSet,可以將WebRowSet物件輸出成XML格式。
4實現
由於我個人體會這塊最有用並且最基礎的是CachedRowSet部分,所以我只是做了CachedRowSet的實現例子。
CachedRowSet可以通過呼叫populate(ResuletSet rs)來生成資料,一旦獲得資料,CachedRowSet就可以斷開與資料庫的連線,直到往資料庫寫入資料的時候才需建立連線。
例子程式碼如下:
package src;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.RowSet;
import com.sun.rowset.CachedRowSetImpl;
public class testCachedRowSet {
public static void testCachedRowSet() {
}
public static com.sun.rowset.CachedRowSetImpl Query_all() throws SQLException{
Connection conn = null;
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset";
String user="sa";
String password="sa";
// 獲得資料庫連線
conn= DriverManager.getConnection(url,user,password);
java.sql.Statement stmt = conn.createStatement();
// 查詢資料庫,獲得表資料
ResultSet rs =stmt.executeQuery("select * from test");// 根據ResultSet物件生成CachedRowSet型別的物件
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
// 關閉ResultSet
rs.close();
// 關閉資料庫的連線
conn.close();
return crs;
}
public static void main(String[] args) throws SQLException {
String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
Connection conn = null;
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset;SelectMethod=Cursor";//最後注意事項的部分
String user="sa";
String password="sa";
try {
Class.forName(driver).newInstance();
CachedRowSetImpl crs = new CachedRowSetImpl();
crs=Query_all();
crs.setTableName("test");
crs.next();
//改操作
crs.updateString(1, "434");
//查操作
String id = crs.getString("ID");
System.out.println(id);
//刪操作
crs.deleteRow();
crs.updateRow();
// 重新獲取與資料庫的連線
conn= DriverManager.getConnection(url,user,password);
// 將CachedRowSet的內容更新到資料庫
crs.acceptChanges(conn);
// 關閉CachedRowSet
crs.close();
// 關閉資料庫連線
conn.close();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
5注意事項:
用JDBC的時候發現一個問題:“java.sql.SQLException:[Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.”查了一下微軟的官方網站原來才發現,我們使用JDBC的時候所開啟的資料庫連線的預設設定是“手動模式下的直接連線模式”,在該模式下,不能對SQLServer 的資料庫做批量操作,連微軟自己都承認這是設計的問題,其他資料庫暫時沒有發現這個問題,要改變的話我們必須對連線字串做如下修改:“String url="jdbc:microsoft:sqlserver://localhost;DatabaseName;SelectMethod=Cursor";”以保證我們的模式是游標模式而不是直接模式。
6參考文獻:
http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B313181
http://www-128.ibm.com/developerworks/cn/java/j-zhanghz2/