您的位置:首页 > 其它

[学习笔记]小型论坛功能——实现按照指定每页的行数来分页显示记录[3]

2008-04-12 00:00 691 查看


用Jsp 来表述就是如此功能。

package com.bbs.model;

import com.bbs.util.DB;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author lovejavalovejava
*/
/**
此类用来实现分页显示
* 该类最好采用连接池,因为每一次显示页面都要做一次连接
* 本来想用CachedRowSet对象来接受ResultSet对象,可是在netBean提示以后可能要删除此类
* 建议不使用。因此就给连接数据库造成负担。
*
*/
public class PageInfo {
private int pageSize=2; //每页显示的帖子数目[行数]
private int pageCount=0; //总的页数
private String stringSql=null;//设置sql语句
private List<Article> listRs=new ArrayList<Article>();
//用来存放页面数据。

public void setPageCount(int PageCount){
this.pageCount=PageCount;
}

public int getPageCount(){
return this.pageCount;
}

public void setListRs(List<Article> listRs) {
this.listRs = listRs;
}

public List<Article> getListRs() {
return listRs;
}
public int getPageSize() {
return pageSize;
}
public void setStringSql(String sql){
this.stringSql=sql;
}
public String getStringSql(){
return this.stringSql;
}
public void setPageSize(String sql,int pageSize) {
setStringSql(sql);
this.pageSize = pageSize;
Connection conn = null;
Statement stmt = null;
ResultSet rs=null;
try {
conn = DB.getConnection();
/**
设置带有滚动,只读的statement
*/
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs =DB.executeQuery(stmt,stringSql);
/**
* 定位到最后一行
*/
rs.last();
int m= rs.getRow();//m:=总页数
int n=pageSize;
pageCount=((m%n)==0)?m/n:m/n+1;//给总页数赋值
System.out.println("总页数为"+pageCount);

} catch (SQLException ex) {
Logger.getLogger(PageInfo.class.getName()).log(Level.SEVERE, null, ex);
}finally{
DB.close(conn, stmt, rs);
}

}

public void showPage(int page){
/**
俩个i语句f
* 保证了显示的页面不会超过数据表可以表示的页面总数
*/
if (page < 0) {
page = pageCount;
}
if (page > pageCount) {
page = 1;
}
int basePage = (page - 1) * pageSize+1; //实际在数据表中的位置
/** 测试开始行数为数据表中实际开始行数为多少*/
System.out.println("开始行数=" + (basePage));
Connection conn = null;
Statement stmt = null;
ResultSet rs=null;
try {
conn = DB.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs =DB.executeQuery(stmt,stringSql);
int i=1;//计数之用
/**
如果结果集中元组则可以
* 执行
*/
if(rs.next()){
/**
* 当开始的行数不是1则将结果集的光标
* 当前光标---〉指向开始行数的前一行
* 否则表示开始行数为1,上面的if(rs.next())
* 已经将当前光标指向--〉第一条数据了
* 所以为了下面的while(rs.next())
* 则让rs当前光标指向第一条数据之前。
*/
if(basePage!=1){
rs.absolute(basePage-1);
}else{
rs.beforeFirst();
}
/**
用i来记录输出的rs结果集的行数
* 保证只是输出当前页面规定的pageSize大小。
*/
while (rs.next()&&i<=getPageSize()) {
System.out.println( "进入showPage()"+rs.getInt("id"));
Article result = new Article();
result.initFormRs(rs);
listRs.add(result);
i++;
}
} }catch (SQLException ex) {
Logger.getLogger(PageInfo.class.getName()).log(Level.SEVERE, null, ex);
}finally{
DB.close(conn, stmt, rs);
}
}

/**
* 测试方法的正确性
*/
public static void main(String args[]){
PageInfo p=new PageInfo();
p.setPageSize("select * from article",100);
p.showPage(1);
List<Article> list=p.getListRs();
System.out.println(list);
for(int i=0;i<list.size();i++){
int sid=list.get(i).getId();
System.out.println(sid);
int pid=list.get(i).getPid();
System.out.println(pid);
String ss=list.get(i).getCont();
System.out.println(ss);

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: