闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ巻鍋撴潻婵嬫⒑闁偛鑻晶鎾煛鐏炲墽銆掗柍褜鍓ㄧ紞鍡涘磻閸涱厾鏆︾€光偓閸曨剛鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介婧惧亾娴g硶妲堟俊顖氬槻閻楁岸姊洪崨濠傚闁稿鎸歌濠㈣泛顑勭换鍡涙煟閹板吀绨婚柍褜鍓氶崹鍨暦閺囩喓绡€婵﹩鍓涢鍡涙⒑鐠恒劌娅愰柟鍑ゆ嫹 (0) +1 闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊瑜忛弳锕傛煕椤垵浜濋柛娆忕箳閳ь剙绠嶉崕閬嶅箯鐎n喖瑙﹂悗锝庡枟閻撴洟鏌嶉埡浣告灓婵炲牄鍨归湁缁绢參鏀辩€氾拷 (0) +1 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻鎾闁稿鍨块幃妤€鈽夊▎瀣窗濡炪倐鏅滈悡锟犲蓟閿濆绠i柨婵嗘-濡嫮绱撴担鍝勵€岄柛銊ョ埣瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷 (0) +1
闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ巻鍋撴潻婵嬫⒑闁偛鑻晶鎾煛鐏炲墽銆掗柍褜鍓ㄧ紞鍡涘磻閸涱厾鏆︾€光偓閸曨剛鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介婧惧亾娴g硶妲堟俊顖氬槻閻楁岸姊洪崨濠傚闁稿鎸歌濠㈣泛顑勭换鍡涙煟閹板吀绨婚柍褜鍓氶崹鍨暦閺囥垹钃熼柕澶堝劚閻庮參姊虹粔鍡楀濞堟棃鏌﹂崘顏勬灈闁哄矉缍佸顕€宕堕妷銏犱壕闁逞屽墴閺屾稓鈧綆鍋呯亸顓㈡煃閽樺妲搁柍璇茬Ч椤㈡ǹ顦辩紒銊ャ偢閺岀喐绗熼崹顔碱潎閻庤娲橀崕濂杆囬鈧弻锟犲焵椤掑嫭鍤嶉柕澶涚导缁ㄥ姊洪崫鍕窛闁稿鍋よ棢闁绘劗鍎ら崐鍨叏濡厧浜鹃悗姘炬嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛鈩冦仦缁剝淇婇悙顏勨偓鏍礉瑜忕划濠氬箣閻樺樊妫滈梺绉嗗嫷娈曢柣鎾存礋閺岀喖鏌囬敃鈧悘閬嶆煕閵堝拋鍎旈柡灞诲€濆鍫曞箰鎼粹€叉樊闂備礁鎼張顒傜矙閹达箑鐓″璺号堥弸搴ㄦ煙闁箑鏋ら柍璇茬箳缁辨捇宕掑顑藉亾妞嬪孩濯奸柡灞诲劚閻ら箖鏌eΟ娆惧殭闁藉啰鍠栭弻锝夊籍閸屾瀚涢梺杞扮缁夌數鎹㈠┑鍥╃瘈闁稿本纰嶉悘鎾绘⒑閸濆嫭锛嶉柛妯恒偢閳ユ棃宕橀鍢壯囨煕閹扳晛濡煎┑顔惧厴濮婃椽鎮烽弶鎸庮唨闂佺懓鍤栭幏锟�>>

正在阅读:jdk1.5中RowSet子接口教程jdk1.5中RowSet子接口教程

2005-06-08 15:25 出处: 作者:jFresH_MaN 责任编辑:moningfeng
在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读取数据的时候就只读指定的行数的数据,这样我们就避免了一次读取所有数据再进行分页操作。是不是很简单呢? JoinRowSet接口:   这个接口可以提供我们在无连接的状态下直接对结果集进行Join。下面的代码提供了JoinRowSet的实现:   

CachedRowSet crs1=new CaehedRowSetImpl();   crs1.setUrl(“jdbc:mydql://localhost:3306/test”);   crs1.setUsername(“root”);   crs1.setPassword(“”);   crs1.setCommand(“select * from table1”);   crs1.execute();   CachedRowSet crs2=new CaehedRowSetImpl();   crs2.setUrl(“jdbc:mydql://localhost:3306/test”);   crs2.setUsername(“root”);   crs2.setPassword(“”);   crs2.setCommand(“select * from table2”);   crs2.execute();   JoinRowSet jrs=new JoinRowSetImpl();   jrs.addRowSet(crs1,”id”);   jrs.addRowSet(crs2,”id”);   while(jrs.next())   System.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接口就是这个过滤器,我们通过实现这个接口定义过滤条件,下面是示意代码:   

public class Filter implements Predicate {   private int min;   private int max;   private String colName;   public Filter (int min ,int max ,String colName)   {    this.min=min; this.max=max; this.colName=colName;   }   public boolean evaluate (RowSet rs) {   CachedRowSet crs=(CachedRowSet)rs;   if((crs.getInt(colName)>min)&& (crs.getInt(colName)   下面我们就使用这个过滤器来过滤掉id不在min和max之间的数据:   

FilteredRowSet frs=new FilteredRowSet();   ……   frs.setCommand(“select * from table1”);   frs.execute();//先获取所有数据;   frs.setFilter(new Filter(1,20,”id”);//过滤掉id值不在1和20之间的数据;

  因为实现Prdicate接口里面的方法很灵活,所以我们就能很灵活地设置过滤条件,我们就可以只通过一条语句得到不同的结果。 WebRowSet接口:   XML因为其平台无关性越来越受到开发者的青睐,它也是数据持久化的一个不错的选择,WebRowSet封装了读写XML的方法,我们就可以轻松地把数据库的数据持久化到XML或者从XML读取数据写入数据库。   写入到XML文件的方法是wrs.writeXML(new FileOutputStream(“data.xml”));它执行的结果是把内存中的数据写入当前目录里面的data.xml文件中。在这个xml文件里面记录了三类数据:   properties:包括setXXX()方法所有的属性,没有设置的就是默认属性   metadata:包括数据库表的相关元数据,对应ResultSetMetaData里的信息   data:结果集的全部数据,从xml文件读取数据装载到RowSet的方法是readXML(…);只要是按照规范的格式写的xml都可以装载进来。 结语:   五个RowSet接口里面分别都还有一些方法,由于篇幅有限,我只列出了其中一些典型的方法,希望本文对大家进一步学习jdk1.5有所帮助!

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘绘煙缂併垹鏋熼柣鎾寸懄閵囧嫰寮埀顒勵敄濞嗗繄缂氶柟鎵閻撴瑧鈧懓瀚晶妤呭吹閸モ斁鍋撶憴鍕8闁告柨绉堕幑銏犫攽鐎n亞锛滃┑鐐叉閸旀牠鍩㈤弴鐔虹瘈闁汇垽娼у暩濡炪倧缍€濡嫬宓勯梺鍛婄⊕濞兼瑧澹曟繝姘厵闁硅鍔﹂崵娆戠磼閻欌偓閸ㄥ爼寮婚妸鈺傚亞闁稿本绋戦锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸婂潡鏌ㄩ弴鐐测偓鍝ョ不閺嶎厽鐓曟い鎰剁稻缁€鈧紒鐐劤濞硷繝寮婚悢鐓庣畾闁绘鐗滃Λ鍕磼閹冣挃缂侇噮鍨抽幑銏犫槈閵忕姷顓哄┑鐐叉缁绘帗绂掓總鍛娾拺闁告繂瀚銉╂煕鎼达絾鏆鐐插暙椤粓鍩€椤掑嫬绠栨繛鍡樻尭缁狙囨煕椤垵鏋ょ憸鐗堝灥閳规垿鎮欓懠顒佹喖缂備緡鍠栫粔鍫曞礆閹烘绠婚悹鍥蔼閹芥洖鈹戦悙鏉戠仧闁糕晛瀚板顐﹀礃椤旂晫鍙嗗┑鐘绘涧濡瑩藟閻樼偨浜滈柨鏂挎惈閸旓附鎱ㄦ繝鍐┿仢鐎规洏鍔嶇换婵嬪礃閻愵剦妫濋梻鍌欒兌閹虫捇宕甸弽顓炵闁跨噦鎷�