📄 关于记录分页中的问题.htm
字号:
<!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> | <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)+'&u='+escape(d.location.href)+'&c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A> | <A
onclick="return Print()"
href="http://topic.csdn.net/t/20050423/20/3961523.html#">打印</A> | <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> > <A
href="http://community.csdn.net/Expert/ForumsList.asp?typenum=1&roomid=54"
rel=external>Java</A> > <A
href="http://community.csdn.net/Expert/ForumList.asp?typenum=1&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>我做一个留言本,留言记录要分页显示,我为了节省系统资源,不是把所有记录都从数据库中取出, <BR> 我本是用SELECT
* FROM MESSAGE WHERE
ID>每页记录数*当前页数AND每页记录数*(当前页数-1) <BR>
但后来我给留言本加了删除功能,问题在此出现了,如果我删了前五个记录,即ID=1,2,3,4,5 <BR>
但是余下的记录是以ID=6,7……开始的,ID的属性是auto_increment <BR>
这个查询就不好用了,大家有什么好办法吗?要节省系统资源。 <BR> 同时,现在大家用获得系统时间格式如2005-2-5
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>第二问题我知道了 <BR> java.text.SimpleDateFormat sdf=new
java.text.SimpleDateFormat("yyyyMMddHHmmssS"); <BR>
System.out.println(sdf.format( new java.util.Date()));
<BR> <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>用存储过程! <BR> <BR> 传参数页码,每页记录条数,条件。
返回该页的结果集。存储过程中用游标<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中的类),内置了分页的功能,并且是只查询该页的内容: <BR>
贴一个网友的总结:行集挺方便的,省略了一些中间环节 <BR> 在jdk1.4的javax.sql包中有一个
RowSet接口,但是没有具体实现的类。”Tiger”诞生之后,引入了javax.sql.rowset包中的五个子接口和
com.sun.rowset包里面的对应的五个实现类,这样我们就可是使用功能强大的RowSet了。jdk1.5中RowSet的五个子接口分别是
JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和FilteredRowSet,他们为我们的数据库开发带来了强大的功能和方便的操作。
<BR> 我的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>
我首先在test数据库里面创建了两个表用于这次的学习,下面是脚本: <BR> 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); <BR>
然后我就插入了一些数据用于测试。以下内容以我的环境示意,大家只要修改相应地方就可用于自己的测试。 <BR> RowSet
对象可分为两类:有连接的和无连接的。JdbcRowSet是唯一一个有连接的实现,和传统的ResultSet一个样,有连接的实现是基于Jdbc驱动的连接,数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于Reader和Writer流的连接,在需要读取数据和写入数据的时候才建立连接,在整个操作过程中都是断开连接的,后面四个接口对象都是无连接的实现。下面我就针对每一个接口来介绍一下它们各自的功能。
<BR> <BR> JdbcRowSet接口: <BR>
我的理解是这个接口基本上和ResultSet有类似的功能,只不过它的结果集默认是ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的,也就是说默认的结果集就是可以上下滚动和可更新的。
<BR>
因为本身RowSet接口就是ResultSet的子接口,所以1.5里面的所有RowSet都有ResultSet的方法,而JdbcRowSet又只是在默认的属性和ResultSet有区别,所以它对结果集的操作方法和ResultSet都是一样的,我就不具体介绍了,大家可以参考API。
<BR> 下面我介绍一下JdbcRowSet的创建方法,这有两种方法,一种是基于传统的JDBC连接数据库的方法:
<BR> 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); <BR>
这样就创建了一个对象(JdbcRowSetImpl是com.sun.rowset包里面的实现类,文中的五个接口在包中都对应有一个实现类),这个对象里面的数据就是和rs里面的数据是一样的。还有一种创建的方法是使用默认的构造方法,然后set属性得到数据,个人推荐使用第二种方法:
<BR> 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(); <BR>
这样创建的对象是和第一种方法是一样的结果。当然这种方法可以连接一个数据源,如果我们在上下文环境种绑定了一个数据源,JNDI名字是dataSource1,那么下面的代码就可以获得对象:
<BR> JdbcRowSet jrs=new JdbcRowSetImpl();
<BR> jrs.setDataSourceName(“dataSource1”) <BR> jrs.execute();
<BR> 得到对象之后我们就可以使用相应的方法来对数据进行遍历,更新,插入或者删除。 <BR>
我有2点要说明:第一,其它四个接口的对象中除了JoinRowSet创建方式基本都是一样的,只是接口名字和接口实现类的名字不同而已,后面我就不再说明创建对象的方法了。第二,虽然JdbcRowSet默认是可滚动和可更新的,但是这也是需要数据库驱动支持的,我使用的MySql驱动就不支持更新结果集,所以大家使用之前需要阅读驱动的说明文档。
<BR> <BR> CachedRowSet接口: <BR>
它继承于RowSet接口,而且他是无连接的RowSet的其他3个实现的父接口,也就是说其他3个接口都直接或者间接继承了它。从名字我们可以知道,它的原理就是读入数据保存在缓存进行相应的操作。
<BR>
创建接口对象除了上面的两种创建方式,还有一个方法,就是在构造方法里面传递一个SyncProvider。之前我说过无连接的RowSet都是基于流读写的,那么这里所说的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文档的Sample
Coder有这样的实现: <BR> String provider=
“com.fred.providers.HighAvailabilityProvider” <BR> CachedRowSet
crs=new CachedRowSetImpl(provider); <BR>
这样我们就为RowSet设置了特定的Reader和Writer,但是这是需要第三方的包支持的。而我们使用无参的构造方法创建的对象是使用了默认的
SyncProvider,当然一般来说这对于我们就已经足够了。创建了对象之后就可以使用和JdbcRowSet一样的方法来进行就结果集的增删改操作了,但是唯一不同的就是在更新了结果集之后必须调用Writer将缓存中的数据写入数据库,而其方法就是crs.acceptChages();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -