分享
 
 
 

jdk1.5学习之RowSet(一)

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

在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....

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有