jdk1.5學習之RowSet(一)

來源:互聯網
上載者:User

在jdk1.4的javax.sql包中有一個RowSet介面,但是沒有具體實現的類。”Tiger”誕生之後,引入了javax.sql.rowset包中的五個子介面和com.sun.rowset包裡面的對應的五個實作類別,這樣我們就可是使用功能強大的RowSet了。jdk1.5中RowSet的五個子介面分別是JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和FilteredRowSet,他們為我們的資料庫開發帶來了強大的功能和方便的操作。

我的java環境是:RedHat 9

               Jdk 1.5.1_01

               Eclipse 3.1m4

               MySql 4.1.10  (JDBC Driver:org.gjt.mm.mysql.Driver)  

我首先在test資料庫裡面建立了兩個表用於這次的學習,下面是指令碼:

create table table1 (id int not null , name varchar(20) not null);

create table table2 (id int not null, info varchar(20) not null);

然後我就插入了一些資料用於測試。以下內容以我的環境示意,大家只要修改相應地方就可用於自己的測試。            

RowSet對象可分為兩類:有串連的和不需連線的。JdbcRowSet是唯一一個有串連的實現,和傳統的ResultSet一個樣,有串連的實現是基於Jdbc驅動的串連,資料庫的串連是貫穿整個對資料庫的操作。而不需連線的實現是基於Reader和Writer流的串連,在需要讀取資料和寫入資料的時候才建立串連,在整個操作過程中都是中斷連線的,後面四個介面對象都是不需連線的實現。下面我就針對每一個介面來介紹一下它們各自的功能。


 


JdbcRowSet介面:

我的理解是這個介面基本上和ResultSet有類似的功能,只不過它的結果集預設是ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的,也就是說預設的結果集就是可以上下滾動和可更新的。

因為本身RowSet介面就是ResultSet的子介面,所以1.5裡面的所有RowSet都有ResultSet的方法,而JdbcRowSet又只是在預設的屬性和ResultSet有區別,所以它對結果集的操作方法和ResultSet都是一樣的,我就不具體介紹了,大家可以參考API。

       下面我介紹一下JdbcRowSet的建立方法,這有兩種方法,一種是基於傳統的JDBC串連資料庫的方法:

Class.forName(“org.gjt.mm.mysql.Driver”);

Connection conn=DriverManager.getConnection(“jdbc:mydql://localhost:3306/test”,”root’,””);

Statement stmt=conn.createStatement();

ResultSet rs=stamt.executeQuery(“select * from table1”);

JdbcRowSet jrs=new JdbcRowSetImpl(rs);

這樣就建立了一個對象(JdbcRowSetImpl是com.sun.rowset包裡面的實作類別,文中的五個介面在包中都對應有一個實作類別),這個對象裡面的資料就是和rs裡面的資料是一樣的。還有一種建立的方法是使用預設的構造方法,然後set屬性得到資料,個人推薦使用第二種方法:

JdbcRowSet jrs=new JdbcRowSetImpl();

jrs.setUrl(“jdbc:mydql://localhost:3306/test”);

jrs.setUsername(“root”);

jrs.setPassword(“”);

jrs.setCommand(“select * from table1”);

jrs.execute();

這樣建立的對象是和第一種方法是一樣的結果。當然這種方法可以串連一個資料來源,如果我們在上下文環境種綁定了一個資料來源,JNDI名字是dataSource1,那麼下面的代碼就可以獲得對象:

JdbcRowSet jrs=new JdbcRowSetImpl();

       jrs.setDataSourceName(“dataSource1”)

       jrs.execute();

得到對象之後我們就可以使用相應的方法來對資料進行遍曆,更新,插入或者刪除。

       我有2點要說明:第一,其它四個介面的對象中除了JoinRowSet建立方式基本都是一樣的,只是介面名字和介面實作類別的名字不同而已,後面我就不再說明建立對象的方法了。第二,雖然JdbcRowSet預設是可滾動和可更新的,但是這也是需要資料庫驅動支援的,我使用的MySql驅動就不支援更新結果集,所以大家使用之前需要閱讀驅動的說明文檔。


 


CachedRowSet介面:

       它繼承於RowSet介面,而且他是不需連線的RowSet的其他3個實現的父介面,也就是說其他3個介面都直接或者間接繼承了它。從名字我們可以知道,它的原理就是讀入資料儲存在緩衝進行相應的操作。

      建立介面對象除了上面的兩種建立方式,還有一個方法,就是在構造方法裡面傳遞一個SyncProvider。之前我說過不需連線的RowSet都是基於流讀寫的,那麼這裡所說的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文檔的Sample Coder有這樣的實現:

       String provider= “com.fred.providers.HighAvailabilityProvider”

      CachedRowSet crs=new CachedRowSetImpl(provider);

這樣我們就為RowSet設定了特定的Reader和Writer,但是這是需要第三方的包支援的。而我們使用無參的構造方法建立的對象是使用了預設的SyncProvider,當然一般來說這對於我們就已經足夠了。建立了對象之後就可以使用和JdbcRowSet一樣的方法來進行就結果集的增刪改操作了,但是唯一不同的就是在更新了結果集之後必須調用Writer將緩衝中的資料寫入資料庫,而其方法就是crs.acceptChages();

       CachedRowSet提供的最令人興奮的功能就是分頁功能。以前程式員很頭疼的問題就是怎麼處理資料分頁而不影響效能,現在有了CachedRowSet一切都變得那麼簡單,請看下面的代碼:

CachedRowSet crs=new CaehedRowSetImpl();

crs.setUrl(“jdbc:mydql://localhost:3306/test”);

crs.setUsername(“root”);

crs.setPassword(“”);

crs.setCommand(“select * from table1”);

crs.setPageSize(5);

crs.execute();

while(crs.nextPage())

       while(crs.next())

              System.out.println(crs.getInt(“id”+”\t\t”+crs.getString(“name”));

我們在crs.execute()之前設定每頁的資料行數,那麼Reader讀取資料的時候就唯讀指定的行數的資料,這樣我們就避免了一次讀取所有資料再進行分頁操作。是不是很簡單呢?



                        to be continued....


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。