分页查询是一个非常常用的功能,一般我们都用封装好的直接来用,现在我们看看它具体是怎么实现的。
这块是真分页的查询。关于真假分页,通俗一点:真分页就是在库里拿出该页该显示的记录。假分页就是通通从库里取出后,按页显示。
一般,数据量大的采用真分页,数据量小采用假分页。(自己分析的:数据量大,一下拿出时间长,性能差。所以用真分页;数据量小,一下拿出无影响,假分页可以减少IO操作)
首先看看它的流程图:
具体的demo:
/**
* 封装分页信息
*/
package com.bjpowernode.drp.util;
import java.util.List;
public class PageModel<E> {
//结果集
private List<E> list;
//查询记录数
private int totalRecords;
//每页多少条数据
private int pageSize;
//第几页
private int pageNo;
/**
* 总页数
* @return
*/
public int getTotalPages(){
return (totalRecords+pageSize-1)/pageSize;
}
/**
* 取得首页
* @return
*/
public int getTopPageNo(){
return 1;
}
/**
* 获取尾页
* @return
*/
public int getBottomPageNo(){
return getTotalPages();
}
/**
* 上一页
* @return
*/
public int getPreviousPageNo(){
if (pageNo<=1) {
return 1;
}
return pageNo-1;
}
/**
* 下一页
* @return
*/
public int getNextPageNo(){
if(pageNo>=getTotalPages()){
return getTotalPages();
}
return pageNo+1;
}
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
public int getTotalRecords() {
return totalRecords;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
}
分页:
/**
* 分页查询
* @param pageNo 第几页
* @param pageSize 每页多少条数据
* @return PageModel
*/
public PageModel<User> findUserList(int pageNo,int pageSize){
//System.out.println("UserManager.findUserById--userId="+userId);
StringBuffer sbSql=new StringBuffer();
sbSql.append("SELECT user_id,user_name,PASSWORD,contact_tel,email,create_date")
.append(" FROM ")
.append(" (")
.append(" SELECT ROWNUM rn,user_id,user_name,PASSWORD,contact_tel,email,create_date ")
.append(" FROM ")
.append(" (")
.append(" SELECT user_id,user_name,PASSWORD,contact_tel,email,create_date")
.append(" FROM")
.append(" t_user")
.append(" WHERE")
.append(" USER_ID <> 'root'")
.append(" ORDER BY")
.append(" USER_ID")
.append(" )where ROWNUM<=?")
.append(" )")
.append(" WHERE")
.append(" rn > ?");
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
PageModel<User> pageModel=null;
try {
conn = DbUtil.getConnection();
pstmt = conn.prepareStatement(sbSql.toString());
pstmt.setInt(1,pageNo*pageSize);
pstmt.setInt(2, (pageNo-1)*pageSize);
rs=pstmt.executeQuery();
List<User> userList=new ArrayList<User>();
while(rs.next()){
User user=new User();
user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("PASSWORD"));
user.setContactTel(rs.getString("CONTACT_TEL"));
user.setEmal(rs.getString("EMAIL"));
user.setCreateDate(rs.getTimestamp("CREATE_DATE"));
userList.add(user);
}
pageModel=new PageModel<User>();
pageModel.setList(userList);
//TODO setTotalRecords返回0
pageModel.setTotalRecords(getTotalRecords(conn));
pageModel.setPageNo(pageNo);
pageModel.setPageSize(pageSize);
} catch (Exception e) {
e.printStackTrace();
}finally{
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
return pageModel;
}
/**
* 取得总记录数
* @param conn
* @return
*/
private int getTotalRecords(Connection conn)
throws SQLException{
String sql="select count(*) from t_user where USER_ID <> 'root'";
PreparedStatement pstmt=null;
ResultSet rs=null;
int count=0;
try {
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
rs.next();
count=rs.getInt(1);
} finally {
DbUtil.close(rs);
DbUtil.close(pstmt);
}
return count;
}
学习就是不断总结的过程,过程中,又不断积累......关于真假分页的优缺,是自己的分析,有不同意见者,还望指教。