给你一个例子:package com;public class Student {
private String sNo ;
private String sName ;
private String sSex ;
private int iAge ;public Student() {
init();
}private void init() {
sNo = "" ;
sName ="" ;
sSex ="" ;
iAge =0 ;
}public String getsNo(){
return sNo ;
}public String getsName(){
return sName ;
}public String getsSex(){
return sSex ;
}public int getiAge(){
return iAge ;
}public void setsNo(String t_sNo){
sNo = t_sNo ;
}public void setsName(String t_sName){
sName = t_sName ;
}public void setsSex(String t_sSex){
sSex = t_sSex ;
}public void setiAge(int t_iAge){
iAge = t_iAge ;
}
public Student[] getStudents(){
Student[] aStudents = null ;
ResultSet result = Conn.getStatement().executeQuery(sSqlStr);
Vector vStudents = new Vector();
while(result.next()) {
Student oStudents = new Student();
oStudents.setsNo("NO_"+i) ;
oStudents.setsName("Name_"+i) ;
oStudents.setsSex("Sex_"+i) ;
oStudents.setiAge(i*10) ;
vStudents.add(oStudents);
}
int iCount = vStudents.size();
aStudents = new Student[iCount];
vStudents.copyInto(aStudents);
return aStudents ;
}}你也可以不用数组返回,直接用vector.
在jsp中取数据可用。
com.Student aStudent = new com.Student().getStudents();
if (aStudent!=null)
{
for (int i=0;i<aStudent.length;i++){
out.print(aStudent[i].getsNo()) ;
out.print(aStudent[i].getsName()) ;
................
}}你应该知道了吧。:)
private String sNo ;
private String sName ;
private String sSex ;
private int iAge ;public Student() {
init();
}private void init() {
sNo = "" ;
sName ="" ;
sSex ="" ;
iAge =0 ;
}public String getsNo(){
return sNo ;
}public String getsName(){
return sName ;
}public String getsSex(){
return sSex ;
}public int getiAge(){
return iAge ;
}public void setsNo(String t_sNo){
sNo = t_sNo ;
}public void setsName(String t_sName){
sName = t_sName ;
}public void setsSex(String t_sSex){
sSex = t_sSex ;
}public void setiAge(int t_iAge){
iAge = t_iAge ;
}
public Student[] getStudents(){
Student[] aStudents = null ;
ResultSet result = Conn.getStatement().executeQuery(sSqlStr);
Vector vStudents = new Vector();
while(result.next()) {
Student oStudents = new Student();
oStudents.setsNo("NO_"+i) ;
oStudents.setsName("Name_"+i) ;
oStudents.setsSex("Sex_"+i) ;
oStudents.setiAge(i*10) ;
vStudents.add(oStudents);
}
int iCount = vStudents.size();
aStudents = new Student[iCount];
vStudents.copyInto(aStudents);
return aStudents ;
}}你也可以不用数组返回,直接用vector.
在jsp中取数据可用。
com.Student aStudent = new com.Student().getStudents();
if (aStudent!=null)
{
for (int i=0;i<aStudent.length;i++){
out.print(aStudent[i].getsNo()) ;
out.print(aStudent[i].getsName()) ;
................
}}你应该知道了吧。:)
oStudents.setsName("Name_"+i) ;
oStudents.setsSex("Sex_"+i) ;
oStudents.setiAge(i*10) ;
应为:
oStudents.setsNo(result.getString("No")) ;
oStudents.setsName(result.getString("Name")) ;
oStudents.setsSex(result.getString("Sex")) ;
oStudents.setiAge(result.getInt("Age")) ;
两种方法。
你自己好好想想吧。
我上面只是对记录的取出,如是还是先分页后再取出,ResultSet result = Conn.getStatement().executeQuery(sSqlStr);中的sSqlStr是分页后的语句。
如果是先取出来后分页的话,不用我说了吧。
左思右想:我还是没转过来,以往我分页都这么做:******************************************************
ResultSet rs=workM.executeQuery(sql);
//以下用与分页:
rs.last();
rowCount = rs.getRow();
//out.println(rowCount);
//记算总页数
pageCount = (rowCount+pageSize-1) / pageSize;
//调整待显示的页码
if(currPage>pageCount) currPage = pageCount;
if(pageCount>=0)
{
//out.println(pageCount);
//将记录指针定位到待显示页的第一条记录上
rs.absolute((currPage-1) * pageSize + 1);//显示数据
i = 0;
%><table width=599 class="c-6" cellspacing=1 cellpadding=1>
<tr class="c-5"><td colspan="5" align="center"><font color=blue><% if(request.getParameter("querytype")==null){ %><%=bname %><% } else { %><%="查询结果" %><% } %></font> </td></tr>
<tr class="c-4"><td align=center>书名</td><td align="center">作者</td><td align="center">人气</td><td align="center">书的简介</td><td align="center">下载地址</td></tr>
<%
String myerror=null;
String lid=null;
//rs.next();
try
{
lid=rs.getString("ID");
}
catch(Exception e)
{
myerror="error";
//out.println("yangping");
}
//rs.previous();
rs.absolute((currPage-1) * pageSize + 1);
if(myerror==null)
{
while(i<pageSize && !rs.isAfterLast()) {
String dau=" ";
String ddes=" ";
String ddo=" ";
if(rs.getString("author")==null)
{
dau="暂无";
}
else
{
dau=rs.getString("author");
}
if(rs.getString("description")==null)
{
ddes="暂无";
}
else
{
ddes=rs.getString("description");
ddes=workD.checkString(ddes,30);
}
if(rs.getString("dowloadurl")==null)
{
ddo="暂无";
}
else
{
ddo=rs.getString("dowloadurl");
}
%>
<tr class="c-0">
<td align="center"><a href="onebook.jsp?id=<%=rs.getString("ID") %>"><%=rs.getString("NAME") %></a></td>
<td align="center"><%=dau %></td>
<td align="center"><%=rs.getString("HIT") %></td>
<td align="center"><%=ddes%></td>
<TD align="center"><%=ddo%></TD>
</tr>
<%
rs.next();
i++;}
}
} rs.close();
rs=null;
workM.closeConn();
%>
<tr class="c-0"><td colspan=5 align="right">
第<%=currPage%>页 共<%=pageCount%>页
<%if(currPage<pageCount){%><a href="booklist.jsp?page=<%=currPage+1%>&id=<%=bid %>&name=<%=bname %>"><font color=blue>下一页</font></a><%}%>
<%if(currPage>1){%><a href="booklist.jsp?page=<%=currPage-1%>&id=<%=bid %>&name=<%=bname %>"><font color=blue>上一页</font></a><%}%> ************************************* to Andrawu :
你那段代码是我要做的,但我想知道从jsp获取到了装有对象集合的 vector后如何进行分页,分页得做到jsp文件中吧?(这时已经没有rs...的东西了)。
“如果是先取出来后分页的话,不用我说了吧。”----不用你说了那部分可能是我想知道的 :)to xg_delayth(铁鹰):
sorry.由于小弟水平有线,没有象你那样做过,先取出一定数量记录显示,等到翻页时再取出一定数量显示,(我以前是全拿出来,再分页)我现在主要想把取出记录的方法封装到bean当中,在jsp文件中不会看到任何sql语句,还有connection,resultset....jdbc对象.不知道大虾们明没明白我的意思
现在干脆问大家一个直观的问题:你们在从数据库中取出记录的时候采用的是什么方法,是
通过executeQuery(sql)将resultset 对象返回给jsp.还是把对象集合
Vector 返回给jsp?如果是后者,分页如何解决的?
不过用vector保存所有的记录是很差的哟。
com.Student aStudent = new com.Student().getStudents();
if (aStudent!=null)
{
int rowCount = aStudent.length ;
int pageSize = 20 ;
int pageCount = (rowCount+pageSize-1) / pageSize;
int currPage ; for (int i=currPage*pageSize;i<(currPage+1)*pageSize;i++){
out.print(aStudent[i].getsNo()) ;
out.print(aStudent[i].getsName()) ;
................
}}以上代码没有写完全,自己完成吧。:)
“不过用vector保存所有的记录是很差的哟。”,是什么意思?速度会很慢?你一般采用什么方法?
strSQL="select * from table";//这是分页所需的语句,假设当前页需要显示这个结果集的41到50条记录
pageSQL="select IDENTITY(int,1,1) as Nbr,* into #tmp From (" +strSQL + ") as temp order by Nbr select * from #tmp where nbr between 41 and 50 drop table #tmp " ;
//上面的SQL语句就可以达到这个要求了
strSQL="select * from table";//这是分页所需的语句,假设当前页需要显示这个结果集的41到50条记录
pageSQL="select IDENTITY(int,1,1) as Nbr,* into #tmp From (" +strSQL + ") as temp order by Nbr select * from #tmp where nbr between 41 and 50 drop table #tmp " ;
//上面的SQL语句就可以达到这个要求了
wei有小例子否,给点源码。小弟也准备给以上的兄弟们加分。非常感谢你们!
to beloved:
你有小例子吗?谢谢!
//将记录指针定位到待显示页的第一条记录上
rs.absolute((currPage-1) * pageSize + 1);
我提到的就是说,通过修改SQL语句,返回的记录集rs直接就是当前页需要显示的数据而没有多余的全部其他数据。另外我上面的例子中是针对SQLServer的,oracle也有相关办法可以实现。我页没装oracle,没法测试,你去Oracle版问问也许好些
select * from (select a.*,rownum mynum from tablename order by...)
where mynum>20 and mynum<30
你的SQL只能用在8i以后的版本吧。以前的是不支持在内曾查询中用ORder by的。以前的版本可以用三重子查询,将rownum作为伪列,在外层子查询中对其限定值select * from (select rownum pagenum,a,b,c from (select * from tabl1) )where pagenum<60 and pagenum>30在8.17以后就可以用row_number() over了。哈哈。
select * from
(select ..... row_number() over( .....order by ......) num from xxx) aaa
where aaa.num > ? and aaa.num < ?