⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdk1.5中rowset子接口教程.htm

📁 Sun的高速缓存CachedRowSet方案资料档
💻 HTM
📖 第 1 页 / 共 5 页
字号:
   var MyMar=setInterval(Marquee,speed)
   demo.onmouseover=function() {clearInterval(MyMar)}
   demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}</SCRIPT>
                      </TD></TR></TBODY></TABLE></DIV>  在jdk1.4的javax.sql包中有一个RowSet接口,但是没有具体实现的类。”Tiger”诞生之后,引入了javax.sql.rowset包中的五个子接口和com.sun.rowset包里面的对应的五个实现类,这样我们就可是使用功能强大的RowSet了。jdk1.5中RowSet的五个子接口分别是JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和FilteredRowSet,他们为我们的数据库开发带来了强大的功能和方便的操作。<BR><BR><IFRAME 
                  id=ad_top name=ad_top align=left marginWidth=0 marginHeight=0 
                  src="jdk1.5中RowSet子接口教程.files/show" frameBorder=0 width=320 
                  scrolling=no height=280></IFRAME>  java运行环境是:RedHat 9 
                  <BR>  Jdk 1.5.1_01 <BR>  Eclipse 3.1m4 <BR>  MySql 4.1.10 
                  (JDBC Driver:org.gjt.mm.mysql.Driver) 
                  <BR><BR>  首先在test数据库里面创建了两个表用于这次的学习,下面是脚本:
                  <P clear=both></P><BR><BR>  
                  <P class=code>create table table1 (id int not null , name 
                  varchar(20) not null); <BR>  create table table2 (id int not 
                  null, info varchar(20) not 
                  null);</P><BR><BR>  然后我就插入了一些数据用于测试。以下内容以我的环境示意,大家只要修改相应地方就可用于自己的测试。<BR><BR>  RowSet对象可分为两类:有连接的和无连接的。JdbcRowSet是唯一一个有连接的实现,和传统的ResultSet一个样,有连接的实现是基于Jdbc驱动的连接,数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于Reader和Writer流的连接,在需要读取数据和写入数据的时候才建立连接,在整个操作过程中都是断开连接的,后面四个接口对象都是无连接的实现。下面我就针对每一个接口来介绍一下它们各自的功能。 
                  <BR><BR><STRONG>JdbcRowSet接口:</STRONG> 
                  <BR><BR>  我的理解是这个接口基本上和ResultSet有类似的功能,只不过它的结果集默认是ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的,也就是说默认的结果集就是可以上下滚动和可更新的。 
                  <BR><BR>  因为本身RowSet接口就是ResultSet的子接口,所以1.5里面的所有RowSet都有ResultSet的方法,而JdbcRowSet又只是在默认的属性和ResultSet有区别,所以它对结果集的操作方法和ResultSet都是一样的,我就不具体介绍了,大家可以参考API。<BR><BR>  下面我介绍一下JdbcRowSet的创建方法,这有两种方法,一种是基于传统的<STRONG>JDBC连接数据库的方法:</STRONG> 
                  <BR><BR>  
                  <P class=code>Class.forName(“org.gjt.mm.mysql.Driver”); 
                  <BR>  Connection 
                  conn=DriverManager.getConnection(“jdbc:mydql://localhost:3306/test”,”root’,””); 
                  <BR>  Statement stmt=conn.createStatement(); <BR>  ResultSet 
                  rs=stamt.executeQuery(“select * from table1”); 
                  <BR>  JdbcRowSet jrs=new 
                  JdbcRowSetImpl(rs);</P><BR><BR>  这样就创建了一个对象(JdbcRowSetImpl是com.sun.rowset包里面的实现类,文中的五个接口在包中都对应有一个实现类),这个对象里面的数据就是和rs里面的数据是一样的。还有一种创建的方法是使用默认的构造方法,然后set属性得到数据,<STRONG>个人推荐使用第二种方法:</STRONG> 
                  <BR><BR>  
                  <P class=code>JdbcRowSet jrs=new JdbcRowSetImpl(); 
                  <BR>  jrs.setUrl(“jdbc:mydql://localhost:3306/test”); 
                  <BR>  jrs.setUsername(“root”); <BR>  jrs.setPassword(“”); 
                  <BR>  jrs.setCommand(“select * from table1”); 
                  <BR>  jrs.execute();</P><BR><BR>  这样创建的对象是和第一种方法是一样的结果。当然这种方法可以连接一个数据源,如果我们在上下文环境种绑定了一个数据源,JNDI名字是dataSource1,那么下面的代码就可以获得对象: 
                  <BR><BR>  
                  <P class=code>JdbcRowSet jrs=new JdbcRowSetImpl(); 
                  <BR>  jrs.setDataSourceName(“dataSource1”) 
                  <BR>  jrs.execute();</P><BR><BR>  得到对象之后我们就可以使用相应的方法来对数据进行遍历,更新,插入或者删除。 
                  <BR><BR>  有2点要说明:第一,其它四个接口的对象中除了JoinRowSet创建方式基本都是一样的,只是接口名字和接口实现类的名字不同而已,后面我就不再说明创建对象的方法了。第二,虽然JdbcRowSet默认是可滚动和可更新的,但是这也是需要数据库驱动支持的,我使用的MySql驱动就不支持更新结果集,所以大家使用之前需要阅读驱动的说明文档。 
                  <BR><BR><STRONG>CachedRowSet接口:</STRONG> 
                  <BR><BR>  它继承于RowSet接口,而且他是无连接的RowSet的其他3个实现的父接口,也就是说其他3个接口都直接或者间接继承了它。从名字我们可以知道,它的原理就是读入数据保存在缓存进行相应的操作。 
                  <BR><BR>  创建接口对象除了上面的两种创建方式,还有一个方法,就是在构造方法里面传递一个SyncProvider。之前我说过无连接的RowSet都是基于流读写的,那么这里所说的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文档的Sample 
                  Coder有这样的实现: <BR><BR>  
                  <P class=code>String provider= 
                  “com.fred.providers.HighAvailabilityProvider” 
                  <BR>  CachedRowSet crs=new 
                  CachedRowSetImpl(provider);</P><BR><BR>  这样我们就为RowSet设置了特定的Reader和Writer,但是这是需要第三方的包支持的。而我们使用无参的构造方法创建的对象是使用了默认的SyncProvider,当然一般来说这对于我们就已经足够了。创建了对象之后就可以使用和JdbcRowSet一样的方法来进行就结果集的增删改操作了,但是唯一不同的就是在更新了结果集之后必须调用Writer将缓存中的数据写入数据库,而其方法就是crs.acceptChages(); 
                  <BR><BR>  CachedRowSet提供的最令人兴奋的功能就是分页功能。以前程序员很头疼的问题就是怎么处理数据分页而不影响性能,现在有了CachedRowSet一切都变得那么简单,请看下面的代码: 
                  <BR><BR>  
                  <P class=code>CachedRowSet crs=new CaehedRowSetImpl(); 
                  <BR>  crs.setUrl(“jdbc:mydql://localhost:3306/test”); 
                  <BR>  crs.setUsername(“root”); <BR>  crs.setPassword(“”); 
                  <BR>  crs.setCommand(“select * from table1”); 
                  <BR>  crs.setPageSize(5); <BR>  crs.execute(); 
                  <BR>  while(crs.nextPage()) <BR>  while(crs.next()) 
                  <BR>  System.out.println(crs.getInt(“id”+”\t\t”+crs.getString(“name”));</P><BR><BR>  我们在crs.execute()之前设置每页的数据行数,那么Reader读取数据的时候就只读指定的行数的数据,这样我们就避免了一次读取所有数据再进行分页操作。是不是很简单呢? 
                  <BR><BR><STRONG>JoinRowSet接口:</STRONG> 
                  <BR><BR>  这个接口可以提供我们在无连接的状态下直接对结果集进行Join。下面的代码提供了JoinRowSet的实现:<BR><BR>  
                  <P class=code>CachedRowSet crs1=new CaehedRowSetImpl(); 
                  <BR>  crs1.setUrl(“jdbc:mydql://localhost:3306/test”); 
                  <BR>  crs1.setUsername(“root”); <BR>  crs1.setPassword(“”); 
                  <BR>  crs1.setCommand(“select * from table1”); 
                  <BR>  crs1.execute(); <BR>  CachedRowSet crs2=new 
                  CaehedRowSetImpl(); 
                  <BR>  crs2.setUrl(“jdbc:mydql://localhost:3306/test”); 
                  <BR>  crs2.setUsername(“root”); <BR>  crs2.setPassword(“”); 
                  <BR>  crs2.setCommand(“select * from table2”); 
                  <BR>  crs2.execute(); <BR>  JoinRowSet jrs=new 
                  JoinRowSetImpl(); <BR>  jrs.addRowSet(crs1,”id”); 
                  <BR>  jrs.addRowSet(crs2,”id”); <BR>  while(jrs.next()) 
                  <BR>  System.out.println(jrs.getInt(“id”)+”\t\t”+jrs.getString(“name”)+”\t\t”+jrs.getString(“info”);</P><BR><BR>  这段代码的作用和执行select 
                  * from table1 inner join table2 on 
                  table1.id=table2.id语句得到的结果集是一样的。但是我个人认为与其这样复杂地使用JoinRowSet,不如直接使用这条Join语句来得到CachedRowSet。 
                  <BR><BR>  默认的Join是inner join的,接口还支持cross join,full join,left 
                  outer join和right outer 
                  join,我们通过setJoinType()方法来修改连接类型,当然这还是需要数据库的支持。还有一个值得注意的地方就是,在这个例子里我连接的列在两个表里面都叫id,那么我们取数据的时候就使用id这个名字,那如果两列的名字不一样呢?系统就会为这个连接列取一个默认的名字叫做”MergedCol”。 
                  <BR><BR><STRONG>FilteredRowSet接口:</STRONG> 
                  <BR><BR>  .NET的ADO.NET支持获取结果集使用一定的条件过滤从而得到不同的结果,那现在jdk1.5也能做到了,FilterRowSet接口让我们可以灵活地定义过滤条件达到不同的效果。Javax.sql.rowset包里面的Predicate接口就是这个过滤器,我们通过实现这个接口定义过滤条件,下面是示意代码:<BR><BR>  
                  <P class=code>public class Filter implements Predicate { 
                  <BR>  private int min; <BR>  private int max; <BR>  private 
                  String colName; <BR>  public Filter (int min ,int max ,String 
                  colName)<BR>  { <BR>   this.min=min; this.max=max; 
                  this.colName=colName; <BR>  } <BR>  public boolean evaluate 
                  (RowSet rs) { <BR>  CachedRowSet crs=(CachedRowSet)rs; 
                  <BR>  if((crs.getInt(colName)&gt;min)&amp;&amp; 
                  (crs.getInt(colName)<MAX)) <br>   return true; <BR>else return 
                  false; <BR>  } 
                  <BR>  }</P><BR><BR>  下面我们就使用这个过滤器来过滤掉id不在min和max之间的数据: 
                  <BR><BR>  
                  <P class=code>FilteredRowSet frs=new FilteredRowSet(); 
                  <BR>  …… <BR>  frs.setCommand(“select * from table1”); 
                  <BR>  frs.execute();//先获取所有数据; <BR>  frs.setFilter(new 
                  Filter(1,20,”id”);//过滤掉id值不在1和20之间的数据;</P><BR><BR>  因为实现Prdicate接口里面的方法很灵活,所以我们就能很灵活地设置过滤条件,我们就可以只通过一条语句得到不同的结果。 
                  <BR><BR><STRONG>WebRowSet接口:</STRONG> 
                  <BR><BR>  XML因为其平台无关性越来越受到开发者的青睐,它也是数据持久化的一个不错的选择,WebRowSet封装了读写XML的方法,我们就可以轻松地把数据库的数据持久化到XML或者从XML读取数据写入数据库。 
                  <BR><BR>  写入到XML文件的方法是wrs.writeXML(new 
                  FileOutputStream(“data.xml”));它执行的结果是把内存中的数据写入当前目录里面的data.xml文件中。在这个xml文件里面记录了三类数据: 
                  <BR><BR>  properties:包括setXXX()方法所有的属性,没有设置的就是默认属性 
                  <BR><BR>  metadata:包括数据库表的相关元数据,对应ResultSetMetaData里的信息 
                  <BR><BR>  data:结果集的全部数据,从xml文件读取数据装载到RowSet的方法是readXML(…);只要是按照规范的格式写的xml都可以装载进来。 
                  <BR><BR><STRONG>结语:</STRONG> 
                  <BR>  五个RowSet接口里面分别都还有一些方法,由于篇幅有限,我只列出了其中一些典型的方法,希望本文对大家进一步学习jdk1.5有所帮助! 
                  <BR clear=all>
                  <DIV class=article align=center><A 
                  href="http://www.pconline.com.cn/pcjob/" target=_blank><FONT 
                  color=#ff0000>国内最大的培训课程库,培训课程一目了然,快速搜索即时报名!</FONT></A></DIV><BR>
                  <TABLE cellSpacing=0 cellPadding=3 width="96%" align=center 
                  border=0>
                    <TBODY>
                    <TR>
                      <TD class=article align=right></TD></TR></TBODY></TABLE><BR>
                  <TABLE style="CLEAR: both" cellSpacing=0 cellPadding=0 
                  width="96%" align=center border=0>
                    <TBODY>
                    <TR>
                      <TD align=middle><A name=_comment_tag_>正在加载评论,请稍候…</A>
                        <SCRIPT id=_comment_script_ defer></SCRIPT>

                        <SCRIPT>_comment_script_.src="http://cmt.pconline.com.cn/?";</SCRIPT>
                         </TD></TR></TBODY></TABLE>
                  <DIV align=center><BR><SPAN id=xl_550>ad</SPAN>
                  <TABLE 
                  style="BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid" 
                  cellSpacing=0 width=414 bgColor=#f7f8f9 border=0>
                    <TBODY>
                    <TR>
                      <TD>
                        <DIV id=demoo 
                        style="OVERFLOW: hidden; WIDTH: 380px; HEIGHT: 20px">
                        <DIV id=demoo1>
                        <TABLE cellSpacing=0 cellPadding=0 border=0>
                          <TBODY>
                          <TR>
                            <TD width=201 height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1124838&amp;forum=5" 
                              target=_blank>6800SLI系统登场</A></TD>
                            <TD width=183 height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1126046" 
                              target=_blank>疯狂,6600_AGP标准版小测</A></TD></TR>
                          <TR>
                            <TD height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1098824" 
                              target=_blank>家文:升技NF8主板测试报告!</A></TD>
                            <TD height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1124236&amp;forum=4" 
                              target=_blank>6600GT AGP扔入珠江? </A></TD></TR>
                          <TR>
                            <TD height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1122532&amp;forum=5" 
                              target=_blank>看图猜哪颗CPU超频极限最强!</A></TD>
                            <TD height=18>·<A 
                              href="http://itbbs.pconline.com.cn/traditional/article.jsp?topic=1063634" 
                              target=_blank>无法访问网上邻居解决方案集</A></TD></TR></TBODY></TABLE></DIV>
                        <DIV id=demoo2></DIV></DIV>
                        <SCRIPT>
   var speed=100
   demoo2.innerHTML=demoo1.innerHTML
   function Marquee(){
   if(demoo2.offsetTop-demoo.scrollTop<=0)
   demoo.scrollTop-=demoo1.offsetHeight
   else{
   demoo.scrollTop++
   }
   }
   var MyMar=setInterval(Marquee,speed)
   demoo.onmouseover=function() {clearInterval(MyMar)}
   demoo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}</SCRIPT>
                      </TD></TR></TBODY></TABLE></DIV>
                  <TABLE 
                  style="BORDER-TOP: #303880 1px solid; BORDER-BOTTOM: #303880 1px solid" 
                  height=30 cellSpacing=0 cellPadding=0 width="100%" border=0>
                    <TBODY>
                    <TR align=middle>
                      <TD width="9%"></TD>
                      <TD noWrap width="15%"><IMG height=17 
                        src="jdk1.5中RowSet子接口教程.files/commend.gif" width=17 
                        align=absMiddle> <A 
                        href="http://www.pconline.com.cn/script/email.html?jdk1.5中RowSet子接口教程&amp;http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/635484.html" 
                        target=_blank>发给好友 </A></TD>
                      <TD noWrap width="18%"><IMG height=17 
                        src="jdk1.5中RowSet子接口教程.files/commend6.gif" width=17 
                        align=absMiddle nowrap> <A 
                        href="http://guide.pconline.com.cn/suggest/post.jsp">我要报错</A></TD>
                      <TD noWrap width="19%"><IMG height=17 
                        src="jdk1.5中RowSet子接口教程.files/commend1.gif" width=17 
                        align=absMiddle nowrap> <A 
                        href="http://ittg.pc.com.cn/contribute_pconline/contribute.jsp">投稿给我们</A></TD>
                      <TD noWrap width="14%"><IMG height=17 
                        src="jdk1.5中RowSet子接口教程.files/commend4.gif" width=17 
                        align=absMiddle nowrap> <A 
                        href="javascript:window.external.AddFavorite('http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/635484.html',%20'jdk1.5中RowSet子接口教程')">加入收藏</A></TD>
                      <TD width="14%" height=24><IMG height=17 
                        src="jdk1.5中RowSet子接口教程.files/commend3.gif" width=17 
                        align=absMiddle> <A 
                        href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/635484.html#">返回顶部</A></TD>
                      <TD width="11%" 
              height=24></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
            <TABLE 
            style="BORDER-TOP: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
            cellSpacing=0 cellPadding=0 width="100%" 
            background=jdk1.5中RowSet子接口教程.files/xgart_bg.gif border=0>
              <TBODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -