菜鸟学Java——分页查询

今天继续跟大家说说一些非常基础的东西,这次我们说说分页查询。说到分页,可能很多人都听说过什么真分页、假分页的。简单解释一下,拿第二页,每页20条为例:真分:数据库里取 的就是21-40条;假分:数据库取出所有的,然后显示21-40。今天我们要说的就是所谓的真分页。

 

下面是分页查询的核心代码:

/**
 * 分页查询
 * @param pageNo 第几页
 * @param pageSize 每页多少条数据
 * @return pageModel
 */
public PageModel findUserList(int pageNo, int pageSize) {
	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 from t_user where user_id <> 'root' order by user_id ")
		.append(")  where rownum <= ? ")
		.append(")  where rn > ? ");
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	PageModel 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 userList = new ArrayList();
		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.setEmail(rs.getString("email"));
			user.setCreateDate(rs.getTimestamp("create_date"));
			userList.add(user);
		}
		pageModel = new PageModel();
		pageModel.setList(userList);
		pageModel.setTotalRecords(getTotalRecords(conn));
		pageModel.setPageSize(pageSize);
		pageModel.setPageNo(pageNo);
	}catch(SQLException 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;
}

 

基本思路就是通过rownum控制查询的记录,想要了解更多关于rownum的信息请用力戳解析oracle的rownum

 

下面是一个分页信息的实体类,将分页信息封装了一下:

import java.util.List;

/**
 * 封装分页信息
 * @author Administrator
 *
 */
public class PageModel {

	//结果集
	private List 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 getPreviousPageNo() {
		if (pageNo <= 1) {
			return 1;
		}
		return pageNo - 1;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPageNo() {
		if (pageNo >= getBottomPageNo()) {
			return getBottomPageNo();
		}
		return pageNo + 1;	
	}
	
	/**
	 * 取得尾页
	 * @return
	 */
	public int getBottomPageNo() {
		return getTotalPages();
	}
	
	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public int getTotalRecords() {
		return totalRecords;
	}

	public void setTotalRecords(int totalRecords) {
		this.totalRecords = totalRecords;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}
}

 


最后有几点需要注意:Oracle 认为rownum对于rownum<n((n>1的自然数)的条件认为是成立的,可以找到记录。但是认为rownum> n(n>1的自然数)这种条件不成立,所以查不到记录。想要查找某条记录以后的记录可以用子查询的方式解决,注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

 

 

好了,今天就说到这里吧,其他的留着以后慢慢说。


 

  • 43
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 69
    评论
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘水镜

文章写得不错,我要让更多人看到

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值