服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jdk1.5中rowset子接口教程

  在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)  return true;
else return false;
  }
  }



  下面我们就使用这个过滤器来过滤掉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有所帮助!

扫描关注微信公众号