【demo积累】——真分页查询

    分页查询是一个非常常用的功能,一般我们都用封装好的直接来用,现在我们看看它具体是怎么实现的。

    这块是真分页的查询。关于真假分页,通俗一点:真分页就是在库里拿出该页该显示的记录。假分页就是通通从库里取出后,按页显示。

    一般,数据量大的采用真分页,数据量小采用假分页。(自己分析的:数据量大,一下拿出时间长,性能差。所以用真分页;数据量小,一下拿出无影响,假分页可以减少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;
	}

    学习就是不断总结的过程,过程中,又不断积累......关于真假分页的优缺,是自己的分析,有不同意见者,还望指教。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值