<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 22,comments - 35,trackbacks - 0

    [摘錄]: http://www.itwen.com

        在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連接數據庫的方法:

    1Class.forName(“org.gjt.mm.mysql.Driver”);
    2Connection conn=DriverManager.getConnection(“jdbc:mydql://localhost:3306/test”,”root’,””);
    3Statement stmt=conn.createStatement();
    4ResultSet rs=stamt.executeQuery(“select * from table1”);
    5JdbcRowSet jrs=new JdbcRowSetImpl(rs);

    這樣就創建了一個對象(JdbcRowSetImpl是com.sun.rowset包里面的實現類,文中的五個接口在包中都對應有一個實現類),這個對象里面的數據就是和rs里面的數據是一樣的。還有一種創建的方法是使用默認的構造方法,然后set屬性得到數據,個人推薦使用第二種方法:

    1JdbcRowSet jrs=new JdbcRowSetImpl();
    2jrs.setUrl(“jdbc:mydql://localhost:3306/test”);
    3jrs.setUsername(“root”);
    4jrs.setPassword(“”);
    5jrs.setCommand(“select * from table1”);
    6jrs.execute();

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

    1JdbcRowSet jrs=new JdbcRowSetImpl();
    2jrs.setDataSourceName(“dataSource1”)
    3jrs.execute();

    得到對象之后我們就可以使用相應的方法來對數據進行遍歷,更新,插入或者刪除。

    我有2點要說明:第一,其它四個接口的對象中除了JoinRowSet創建方式基本都是一樣的,只是接口名字和接口實現類的名字不同而已,后面我就不再說明創建對象的方法了。第二,雖然JdbcRowSet默認是可滾動和可更新的,但是這也是需要數據庫驅動支持的,我使用的MySql驅動就不支持更新結果集,所以大家使用之前需要閱讀驅動的說明文檔。

    CachedRowSet接口:

    它繼承于RowSet接口,而且他是無連接的RowSet的其他3個實現的父接口,也就是說其他3個接口都直接或者間接繼承了它。從名字我們可以知道,它的原理就是讀入數據保存在緩存進行相應的操作。
    創建接口對象除了上面的兩種創建方式,還有一個方法,就是在構造方法里面傳遞一個SyncProvider。之前我說過無連接的RowSet都是基于流讀寫的,那么這里所說的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文檔的Sample Coder有這樣的實現:

    1String provider= “com.fred.providers.HighAvailabilityProvider”
    2CachedRowSet crs=new CachedRowSetImpl(provider);

    這樣我們就為RowSet設置了特定的Reader和Writer,但是這是需要第三方的包支持的。而我們使用無參的構造方法創建的對象是使用了默認的 SyncProvider,當然一般來說這對于我們就已經足夠了。創建了對象之后就可以使用和JdbcRowSet一樣的方法來進行就結果集的增刪改操作了,但是唯一不同的就是在更新了結果集之后必須調用Writer將緩存中的數據寫入數據庫,而其方法就是crs.acceptChages();
    CachedRowSet提供的最令人興奮的功能就是分頁功能。以前程序員很頭疼的問題就是怎么處理數據分頁而不影響性能,現在有了CachedRowSet一切都變得那么簡單,請看下面的代碼:

     1CachedRowSet crs=new CaehedRowSetImpl();
     2crs.setUrl(“jdbc:mydql://localhost:3306/test”);
     3crs.setUsername(“root”);
     4crs.setPassword(“”);
     5crs.setCommand(“select * from table1”);
     6crs.setPageSize(5);
     7crs.execute();
     8while(crs.nextPage())
     9while(crs.next())
    10System.out.println(crs.getInt(“id”+”\t\t”+crs.getString(“name”));

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

    JoinRowSet接口:

    這個接口可以提供我們在無連接的狀態下直接對結果集進行Join。下面的代碼提供了JoinRowSet的實現:

     1CachedRowSet crs1=new CaehedRowSetImpl();
     2crs1.setUrl(“jdbc:mydql://localhost:3306/test”);
     3crs1.setUsername(“root”);
     4crs1.setPassword(“”);
     5crs1.setCommand(“select * from table1”);
     6crs1.execute();
     7CachedRowSet crs2=new CaehedRowSetImpl();
     8crs2.setUrl(“jdbc:mydql://localhost:3306/test”);
     9crs2.setUsername(“root”);
    10crs2.setPassword(“”);
    11crs2.setCommand(“select * from table2”);
    12crs2.execute();
    13JoinRowSet jrs=new JoinRowSetImpl();
    14jrs.addRowSet(crs1,”id”);
    15jrs.addRowSet(crs2,”id”);
    16while(jrs.next())
    17System.out.println(jrs.getInt(“id”)+”\t\t”+jrs.getString(“name”)+”\t\t”+jrs.getString(“info”);

    這段代碼的作用和執行select * from table1 inner join table2 on table1.id=table2.id語句得到的結果集是一樣的。但是我個人認為與其這樣復雜地使用JoinRowSet,不如直接使用這條Join語句來得到CachedRowSet。
    默認的Join是inner join的,接口還支持cross join,full join,left outer join和right outer join,我們通過setJoinType()方法來修改連接類型,當然這還是需要數據庫的支持。還有一個值得注意的地方就是,在這個例子里我連接的列在兩個表里面都叫id,那么我們取數據的時候就使用id這個名字,那如果兩列的名字不一樣呢?系統就會為這個連接列取一個默認的名字叫做” MergedCol”。

    FilteredRowSet接口:

    .NET的ADO.NET支持獲取結果集使用一定的條件過濾從而得到不同的結果,那現在jdk1.5也能做到了,FilterRowSet接口讓我們可以靈活地定義過濾條件達到不同的效果。Javax.sql.rowset包里面的Predicate接口就是這個過濾器,我們通過實現這個接口定義過濾條件,下面是示意代碼:

     1public class Filter implements Predicate {
     2private int min;
     3private int max;
     4private String colName;
     5public Filter (int min ,int max ,String colName) {
     6this.min=min; this.max=max; this.colName=colName;
     7}

     8public boolean evaluate (RowSet rs) {
     9CachedRowSet crs=(CachedRowSet)rs;
    10if((crs.getInt(colName)>min)&& (crs.getInt(colName){
    11 
    12    }

    13  }

    14}

    15

     



     

    posted on 2006-03-02 23:46 kelven 閱讀(212) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 2022年亚洲午夜一区二区福利 | 精品久久8x国产免费观看| 亚洲高清成人一区二区三区| 亚洲av无码专区在线观看下载| AV片在线观看免费| 亚洲中文字幕乱码一区| 巨胸喷奶水视频www网免费| 伊人久久亚洲综合影院首页| 麻豆国产精品入口免费观看| 亚洲1区2区3区精华液| 亚洲高清视频一视频二视频三| 一级毛片一级毛片免费毛片| 中文字幕无码精品亚洲资源网| 国产在线国偷精品免费看| 亚洲午夜精品一区二区| 国产人在线成免费视频| 国产亚洲精品第一综合| 国产AV无码专区亚洲AWWW| 99在线观看免费视频| 国产.亚洲.欧洲在线| 国产成人免费a在线视频色戒| 午夜免费国产体验区免费的| 国产亚洲一区二区三区在线观看| 久久免费观看国产精品| 精品亚洲成在人线AV无码| 亚洲国产精品日韩| 久久精品免费观看国产| 亚洲最大中文字幕无码网站| 亚洲国产综合无码一区二区二三区 | 人妻仑刮八A级毛片免费看| 亚洲色欲色欲www在线丝| 1000部拍拍拍18勿入免费视频软件 | 亚洲AV无码乱码精品国产| 91成人免费观看在线观看| 亚洲一级毛片免观看| 亚洲国产精品一区二区第一页免 | 国产一区二区三区免费观在线| 国产成人精品日本亚洲18图| 亚洲精品无码成人片在线观看 | 91在线手机精品免费观看| 国产亚洲福利一区二区免费看 |