[这个贴子最后由RoadStar在 2002/12/11 04:01pm 编辑]
如何做?
有setMaxRecord类似于些的方法吗?
cinc 回复于:2002-12-11 16:32:14
先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。
然后查询结果输出界面: result.jsp
比如每页 20 个结果
result.jsp 自动重定向到 result.jsp?page=1
result.jsp?page=1 前 20 个: 0。。19
result.jsp?page=2 输出 : 20。。39
result.jsp?page=3 输出 : 40。。59
...
不知道有没有更好的方法。
startunix 回复于:2002-12-11 16:53:45
我做的时候是把输出放在ArrayList中间(由于vector费资源。。),但是如果把rs返回到jsp中间的话,是不太好的,不利于组件话思想。
RoadStar 回复于:2002-12-11 17:00:33
startunix
能不能把你的POST出来一个看看?
cinc 回复于:2002-12-11 17:12:39
结构就是:
jsp -> java bean -> database
java bean 里通过 jdbc 查询数据库,并把结果存放成 result[] 的形式
每个 result 对象表示数据库里的一个记录。
jsp 页面里把 这个 result[] 取出来显示。
这样 jsp 就没有直接和 数据库做操作,比较节省资源。
johnx 回复于:2002-12-11 17:26:13
板主弄个源代码出来看看萨
imagegarden 回复于:2002-12-11 18:26:11
[quote]下面引用由cinc在 2002/12/11 04:32pm 发表的内容:
先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。
然后查询结果输出界面: result.jsp
比如每页 20 个结果
result.jsp 自动重定向到 result.jsp?page=1
...
[/quote]
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊
cinc 回复于:2002-12-12 08:43:20
[quote]下面引用由imagegarden在 2002/12/11 06:26pm 发表的内容:
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊
[/quote]
我现在也只能做到,查询出所有符合条件的记录(result set)
然后把中间的 20 个放在一个数组里,让 jsp 来取。
如何让查询时就只返回 20 个还是没办法做到的。好像 sql 不支持。
eclipse 回复于:2002-12-12 09:10:06
不能回贴,就贴图吧
eclipse 回复于:2002-12-12 09:13:33
JSP数据库操数据分页显示
--------------------------------------------------------------------------------
源作者:何志强 人气:3614
<%@ page contentType="text/html;charset=8859_1" %>
<%
//变量声明
java.sql.Connection sqlCon; //数据库连接对象
java.sql.Statement sqlStmt; //SQL语句对象
java.sql.ResultSet sqlRst; //结果集对象
java.lang.String strCon; //数据库连接字符串
java.lang.String strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
java.lang.String strPage;
int i;
//设置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = request.getParameter("page";
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程序
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//设置数据库连接字符串
strCon = "jdbcracle:thin:@linux:1521ra4cweb";
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq";
//创建一个可以滚动的只读的SQL语句对象
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
//准备SQL语句
strSQL = "select name,age from test";
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
if(intPageCount>0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%> <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>
</body>
</html>
<%
//关闭结果集
sqlRst.close();
//关闭SQL语句对象
sqlStmt.close();
//关闭数据库
sqlCon.close();
%>
eclipse 回复于:2002-12-12 09:18:42
http://www.ambysoft.com/persistenceLayer.pdf
9命怪猫 回复于:2002-12-12 09:22:40
偶用过ASP,那里边从数据库里读出数据来(放在recordset对象里边),就可以在对象里边直接设置pagesize属性,用以分页。不知道jsp是不是也可以如此。
cinc 回复于:2002-12-12 09:44:01
[这个贴子最后由cinc在 2002/12/12 09:48am 编辑]
[quote]下面引用由eclipse在 2002/12/12 09:13am 发表的内容:
JSP数据库操数据分页显示
--------------------------------------------------------------------------------
源作者:何志强 人气:3614
...
[/quote]
对。没错。
下面是从别人那里抄来的一段代码。用来返回某一页上显示的部分帖子:
/**
* Get the top-level threads under the given category from start index
*
* @param category - The category
* @param startIndex - The start index for retrieveing the records
* @param length - The number of records to be tretieved
* @return Collection - A collection of threads under the given category
*/
public Collection findByCategory( final int category,
final int startIndex,
final int endIndex
throws SQLException, CategoryNotFoundException {
final Connection conn = getConnection();
final ArrayList result = new ArrayList();
final PreparedStatement stat
= conn.prepareStatement( "select * from threads where category_id=" + category
+ "order by last_update DESC" ;
final ResultSet resultSet = stat.executeQuery();
if( resultSet.absolute( startIndex
{
do{
result.add( new Thread( resultSet.getString("id",
resultSet.getString("title" ,
resultSet.getString("content",
resultSet.getString("author",
resultSet.getLong("last_update")
}while( resultSet.next() && (resultSet.getRow() <= endIndex) ;
}
stat.close();
conn.close();
return result;
}
Thread 表示一个帖子
category 是论坛编号
resultSet.absolute( startIndex 用于定位到开始的那个帖子
结果存放在 ArrayList 中返回。
然后在 jsp 里用 while 循环把 collection 里的内容一个一个输出。
cinc 回复于:2002-12-12 09:46:36
[这个贴子最后由cinc在 2002/12/12 09:49am 编辑]
[quote]下面引用由imagegarden在 2002/12/11 06:26pm 发表的内容:
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊
[/quote]
ResultSet 在执行完 execute 后好像还不会把数据库中的记录都读入内存。
只有在 resultSet.next(), resultSet.getXXX("column_name" 的时候才会去读数据库里的数据
这样说来,查询结果比较多应该不会造成性能的下降。
看我上面的代码段。
pwair 回复于:2002-12-13 10:58:04
[这个贴子最后由pwair在 2002/12/13 11:00am 编辑]
各位:我试了一下,
Select top 20 * from table;
不过好像不好用?标准sql支持select top么?