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

📄 关于记录分页中的问题.htm

📁 Sun的高速缓存CachedRowSet方案资料档
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0048)http://topic.csdn.net/t/20050423/20/3961523.html -->
<HTML lang=zh-CN xml:lang="zh-CN" 
xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>关于记录分页中的问题! Java / Web 开发 - CSDN社区 community.csdn.net</TITLE>
<META content=all name=robots>
<META http-equiv=Content-Language content=zh-CN>
<META http-equiv=Content-Type content="text/html; charset=utf-8"><LINK 
href="关于记录分页中的问题.files/topic.css" type=text/css rel=stylesheet>
<SCRIPT src="关于记录分页中的问题.files/Topic.js" type=text/javascript></SCRIPT>

<META 
content="接口 连接 数据 数据库 代码 crs rowset 分页 cachedrowset jdbcrowset Java Web 开发" 
name=Keywords>
<META 
content="我做一个留言本,留言记录要分页显示,我为了节省系统资源,不是把所有记录都从数据库中取出,我本是用SELECT * FROM MESSAGE WHERE ID>每页记录数*当前页数AND每页记录数*(当前页数-1)但后来我给留言本加了删除功能,问题在此出现了,如果我删了前五个记录,即ID=1,2,3,4,5但是余下的记录是以ID=6,7……开始的,ID的属性是auto_increment这个查询就不好用了,大家有什么好办法吗?要节省系统资源。同时,现在大家用获得系统时间格式如2005-2-5 5:30的方法,用的是哪个啊?" 
name=description>
<META content="MSHTML 6.00.2900.3059" name=GENERATOR></HEAD>
<BODY>
<DIV id=wrapper>
<DIV id=innerWrapper>
<TABLE class=CSDN-PHF id=CSDNPHL cellSpacing=1 cellPadding=0 border=0>
  <TBODY>
  <TR>
    <TD><A href="http://www.csdn.net/" rel=external>CSDN首页</A></TD>
    <TD><A href="http://news.csdn.net/" rel=external>新闻</A></TD>
    <TD><A href="http://bbs.csdn.net/" rel=external><STRONG>论坛</STRONG></A></TD>
    <TD><A href="http://groups.csdn.net/" 
    rel=external><STRONG>小组</STRONG></A></TD>
    <TD><A href="http://blog.csdn.net/" 
    rel=external><STRONG>Blog</STRONG></A></TD>
    <TD><A href="http://dev.csdn.net/" rel=external>文档</A></TD>
    <TD><A href="http://download.csdn.net/" rel=external>下载</A></TD>
    <TD><A href="http://book.csdn.net/" rel=external>读书</A></TD>
    <TD><A href="http://tag.csdn.net/" 
rel=external><STRONG>Tag</STRONG></A></TD>
    <TD><A href="http://wz.csdn.net/" rel=external><STRONG>网摘</STRONG></A></TD>
    <TD><A href="http://search.csdn.net/" 
    rel=external><STRONG>搜索</STRONG></A></TD>
    <TD><A href="http://dotnet.csdn.net/" 
      rel=external><STRONG>.NET</STRONG></A></TD>
    <TD><A href="http://java.csdn.net/" 
    rel=external><STRONG>Java</STRONG></A></TD>
    <TD><A href="http://gamedev.csdn.net/" rel=external>游戏</A></TD>
    <TD><A href="http://live.csdn.net/" rel=external>视频</A></TD>
    <TD><A href="http://job.csdn.net/" rel=external>人才</A></TD>
    <TD><A href="http://prj.csdn.net/" rel=external>外包</A></TD>
    <TD><A href="http://www.dearbook.com.cn/" rel=external>第二书店</A></TD>
    <TD><A href="http://www.programmer.com.cn/" 
  rel=external>程序员</A></TD></TR></TBODY></TABLE>
<DIV id=logo><A href="http://community.csdn.net/" rel=external><IMG class=logo 
alt=CSDN社区 src="关于记录分页中的问题.files/logo_csdn.gif"></A><A 
href="http://book.csdn.net/" rel=external><IMG alt="" 
src="关于记录分页中的问题.files/book_468_60.gif"></A><A 
href="http://search.codechina.net/" rel=external><IMG alt="" 
src="关于记录分页中的问题.files/codesearch_120_60.gif"></A> <IMG style="DISPLAY: none" 
alt="" src="关于记录分页中的问题.files/pv.htm"> </DIV>
<DIV id=navigation>
<DIV id=search>
<DIV id=innerSearch><INPUT id=key onfocus="value=''"><A 
onclick="return Search()" 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">搜索</A>&nbsp;|&nbsp;<A 
title=功能强大的网络收藏夹,一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐 
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A>&nbsp;|&nbsp;<A 
onclick="return Print()" 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">打印</A>&nbsp;|&nbsp;<A 
onclick="return Close()" 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">关闭</A> </DIV></DIV>
<DIV><A class=CSDNRoom href="http://community.csdn.net/" 
rel=external>CSDN社区</A>&nbsp;&gt;&nbsp; <A 
href="http://community.csdn.net/Expert/ForumsList.asp?typenum=1&amp;roomid=54" 
rel=external>Java</A>&nbsp;&gt;&nbsp; <A 
href="http://community.csdn.net/Expert/ForumList.asp?typenum=1&amp;roomid=5409" 
rel=external>Web 开发</A> </DIV></DIV>
<DIV id=mainWrapper>
<DIV id=pageContent>
<DIV id=innerContent>
<H1>关于记录分页中的问题!</H1>
<DIV class=author><A class=anchor name=Top>楼主</A>v38(国产磁悬浮拖拉机)<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button>2005-04-23 
20:43:29 在 Java / Web 开发 提问</DIV>
<P>我做一个留言本,留言记录要分页显示,我为了节省系统资源,不是把所有记录都从数据库中取出, &nbsp; <BR>&nbsp; 我本是用SELECT 
&nbsp; * &nbsp; FROM &nbsp; MESSAGE &nbsp; WHERE &nbsp; 
ID&gt;每页记录数*当前页数AND每页记录数*(当前页数-1) &nbsp; <BR>&nbsp; 
但后来我给留言本加了删除功能,问题在此出现了,如果我删了前五个记录,即ID=1,2,3,4,5 &nbsp; <BR>&nbsp; 
但是余下的记录是以ID=6,7……开始的,ID的属性是auto_increment &nbsp; <BR>&nbsp; 
这个查询就不好用了,大家有什么好办法吗?要节省系统资源。 &nbsp; <BR>&nbsp; 同时,现在大家用获得系统时间格式如2005-2-5 &nbsp; 
5:30的方法,用的是哪个啊? <SPAN>问题点数:20、回复次数:4</SPAN><A 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">Top</A> </P>
<DIV class=tagad><IFRAME src="关于记录分页中的问题.files/Board.htm" frameBorder=0 
scrolling=no></IFRAME></DIV>
<H3><STRONG><A class=anchor name=r_29175165>1 楼</A>v38(国产磁悬浮拖拉机)<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2005-04-23 20:47:02 得分 0 </SPAN></H3>
<P>第二问题我知道了 &nbsp; <BR>&nbsp; java.text.SimpleDateFormat &nbsp; sdf=new &nbsp; 
java.text.SimpleDateFormat("yyyyMMddHHmmssS"); &nbsp; <BR>&nbsp; 
System.out.println(sdf.format( &nbsp; new &nbsp; java.util.Date())); &nbsp; 
<BR>&nbsp; <A 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_29179435>2 楼</A>v38(国产磁悬浮拖拉机)<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2005-04-24 09:12:06 得分 0 </SPAN></H3>
<P>顶,大家帮我看看啊<A 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_29183068>3 楼</A>jihanzhong(逍遥)<INPUT class=star1 title="一星用户 该版得分小于等于10000分,大于5000分" type=button></STRONG><SPAN>回复于 
2005-04-24 14:01:58 得分 <EM>10</EM></SPAN></H3>
<P>用存储过程! &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 传参数页码,每页记录条数,条件。 &nbsp; 
返回该页的结果集。存储过程中用游标<A 
href="http://topic.csdn.net/t/20050423/20/3961523.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_29185947>4 楼</A>wafeng(彭克)<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2005-04-24 17:48:29 得分 <EM>10</EM></SPAN></H3>
<P>用行集CacheRowSet(jdk1.5中的类),内置了分页的功能,并且是只查询该页的内容: &nbsp; <BR>&nbsp; 
贴一个网友的总结:行集挺方便的,省略了一些中间环节 &nbsp; <BR>&nbsp; 在jdk1.4的javax.sql包中有一个 &nbsp; 
RowSet接口,但是没有具体实现的类。”Tiger”诞生之后,引入了javax.sql.rowset包中的五个子接口和 &nbsp; 
com.sun.rowset包里面的对应的五个实现类,这样我们就可是使用功能强大的RowSet了。jdk1.5中RowSet的五个子接口分别是 &nbsp; 
JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和FilteredRowSet,他们为我们的数据库开发带来了强大的功能和方便的操作。 
&nbsp; <BR>&nbsp; 我的java环境是:RedHat &nbsp; 9 &nbsp; <BR>&nbsp; Jdk &nbsp; 
1.5.1_01 &nbsp; <BR>&nbsp; Eclipse &nbsp; 3.1m4 &nbsp; <BR>&nbsp; MySql &nbsp; 
4.1.10 &nbsp; (JDBC &nbsp; Driver:org.gjt.mm.mysql.Driver) &nbsp; <BR>&nbsp; 
我首先在test数据库里面创建了两个表用于这次的学习,下面是脚本: &nbsp; <BR>&nbsp; create &nbsp; table &nbsp; 
table1 &nbsp; (id &nbsp; int &nbsp; not &nbsp; null &nbsp; , &nbsp; name &nbsp; 
varchar(20) &nbsp; not &nbsp; null); &nbsp; <BR>&nbsp; create &nbsp; table 
&nbsp; table2 &nbsp; (id &nbsp; int &nbsp; not &nbsp; null, &nbsp; info &nbsp; 
varchar(20) &nbsp; not &nbsp; null); &nbsp; <BR>&nbsp; 
然后我就插入了一些数据用于测试。以下内容以我的环境示意,大家只要修改相应地方就可用于自己的测试。 &nbsp; <BR>&nbsp; RowSet &nbsp; 
对象可分为两类:有连接的和无连接的。JdbcRowSet是唯一一个有连接的实现,和传统的ResultSet一个样,有连接的实现是基于Jdbc驱动的连接,数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于Reader和Writer流的连接,在需要读取数据和写入数据的时候才建立连接,在整个操作过程中都是断开连接的,后面四个接口对象都是无连接的实现。下面我就针对每一个接口来介绍一下它们各自的功能。 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; JdbcRowSet接口: &nbsp; <BR>&nbsp; 
我的理解是这个接口基本上和ResultSet有类似的功能,只不过它的结果集默认是ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的,也就是说默认的结果集就是可以上下滚动和可更新的。 
&nbsp; <BR>&nbsp; 
因为本身RowSet接口就是ResultSet的子接口,所以1.5里面的所有RowSet都有ResultSet的方法,而JdbcRowSet又只是在默认的属性和ResultSet有区别,所以它对结果集的操作方法和ResultSet都是一样的,我就不具体介绍了,大家可以参考API。 
&nbsp; <BR>&nbsp; 下面我介绍一下JdbcRowSet的创建方法,这有两种方法,一种是基于传统的JDBC连接数据库的方法: &nbsp; 
<BR>&nbsp; Class.forName(“org.gjt.mm.mysql.Driver”); &nbsp; <BR>&nbsp; 
Connection &nbsp; 
conn=DriverManager.getConnection(“jdbc:mydql://localhost:3306/test”,”root’,””); 
&nbsp; <BR>&nbsp; Statement &nbsp; stmt=conn.createStatement(); &nbsp; 
<BR>&nbsp; ResultSet &nbsp; rs=stamt.executeQuery(“select &nbsp; * &nbsp; from 
&nbsp; table1”); &nbsp; <BR>&nbsp; JdbcRowSet &nbsp; jrs=new &nbsp; 
JdbcRowSetImpl(rs); &nbsp; <BR>&nbsp; 
这样就创建了一个对象(JdbcRowSetImpl是com.sun.rowset包里面的实现类,文中的五个接口在包中都对应有一个实现类),这个对象里面的数据就是和rs里面的数据是一样的。还有一种创建的方法是使用默认的构造方法,然后set属性得到数据,个人推荐使用第二种方法: 
&nbsp; <BR>&nbsp; JdbcRowSet &nbsp; jrs=new &nbsp; JdbcRowSetImpl(); &nbsp; 
<BR>&nbsp; jrs.setUrl(“jdbc:mydql://localhost:3306/test”); &nbsp; <BR>&nbsp; 
jrs.setUsername(“root”); &nbsp; <BR>&nbsp; jrs.setPassword(“”); &nbsp; 
<BR>&nbsp; jrs.setCommand(“select &nbsp; * &nbsp; from &nbsp; table1”); &nbsp; 
<BR>&nbsp; jrs.execute(); &nbsp; <BR>&nbsp; 
这样创建的对象是和第一种方法是一样的结果。当然这种方法可以连接一个数据源,如果我们在上下文环境种绑定了一个数据源,JNDI名字是dataSource1,那么下面的代码就可以获得对象: 
&nbsp; <BR>&nbsp; JdbcRowSet &nbsp; jrs=new &nbsp; JdbcRowSetImpl(); &nbsp; 
<BR>&nbsp; jrs.setDataSourceName(“dataSource1”) &nbsp; <BR>&nbsp; jrs.execute(); 
&nbsp; <BR>&nbsp; 得到对象之后我们就可以使用相应的方法来对数据进行遍历,更新,插入或者删除。 &nbsp; <BR>&nbsp; 
我有2点要说明:第一,其它四个接口的对象中除了JoinRowSet创建方式基本都是一样的,只是接口名字和接口实现类的名字不同而已,后面我就不再说明创建对象的方法了。第二,虽然JdbcRowSet默认是可滚动和可更新的,但是这也是需要数据库驱动支持的,我使用的MySql驱动就不支持更新结果集,所以大家使用之前需要阅读驱动的说明文档。 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; CachedRowSet接口: &nbsp; <BR>&nbsp; 
它继承于RowSet接口,而且他是无连接的RowSet的其他3个实现的父接口,也就是说其他3个接口都直接或者间接继承了它。从名字我们可以知道,它的原理就是读入数据保存在缓存进行相应的操作。 
&nbsp; <BR>&nbsp; 
创建接口对象除了上面的两种创建方式,还有一个方法,就是在构造方法里面传递一个SyncProvider。之前我说过无连接的RowSet都是基于流读写的,那么这里所说的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文档的Sample 
&nbsp; Coder有这样的实现: &nbsp; <BR>&nbsp; String &nbsp; provider= &nbsp; 
“com.fred.providers.HighAvailabilityProvider” &nbsp; <BR>&nbsp; CachedRowSet 
&nbsp; crs=new &nbsp; CachedRowSetImpl(provider); &nbsp; <BR>&nbsp; 
这样我们就为RowSet设置了特定的Reader和Writer,但是这是需要第三方的包支持的。而我们使用无参的构造方法创建的对象是使用了默认的 &nbsp; 
SyncProvider,当然一般来说这对于我们就已经足够了。创建了对象之后就可以使用和JdbcRowSet一样的方法来进行就结果集的增删改操作了,但是唯一不同的就是在更新了结果集之后必须调用Writer将缓存中的数据写入数据库,而其方法就是crs.acceptChages(); 

⌨️ 快捷键说明

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