分页总结

1.MySQL和Oracle分页原理:

使用MySQL进行分页:

select * from table limit (pageNo - 1)*pageSize, pageSize;

需要注意的是 limit 子句需要写在查询语句的最后。

使用Oracle进行分页:

(1)最简单的使用:

select t2.*
from (
    select rownum r, t1.*
    from table t1
    where rownum < ?
) t2
where  t2.r > ?

说明:查询小于最大的,大于最小的。随着数据的扩张,查询速度会越来越慢。

(2)无ORDER BY排序的写法。(效率最高) 

SELECT * 
FROM (Select ROWNUM AS ROWNO, T.* 
      from k_task T 
      where Flight_date between to_date('20060501', 'yyyymmdd') 
      and to_date('20060731', 'yyyymmdd') 
      AND ROWNUM <= 20) TABLE_ALIAS 
WHERE TABLE_ALIAS.ROWNO >= 10;

(3)有ORDER BY排序的写法。(效率最高,但是也会随着数据的扩张而越来越慢)

SELECT * 
FROM (SELECT TT.*, ROWNUM AS ROWNO 
      FROM (
          Select t.* 
          from k_task T 
          where flight_date between to_date('20060501', 'yyyymmdd') 
          and to_date('20060531', 'yyyymmdd') 
          ORDER BY FACT_UP_TIME, flight_no) TT 
       WHERE ROWNUM <= 20) TABLE_ALIAS 
where TABLE_ALIAS.rowno >= 10;

2.创建Page类(基础)

封装的数据:

    要显示的数据的集合

    每页显示多少条记录

    总记录数

    总页数

    当前的页码

    是否存在上一页——当前页和1进行比较

    是否存在下一页——当前页和总页数进行比较

    上一页页码

    下一页页码

    首页:1

    末页:总页数

 

数据的来源:

    数据库:

        数据集合

        总记录数

    内部指定

        每页显示多少条记录,可以指定为常量

    内部计算

        总页数

    页面传入

        当前页的页码

 

public class Page<T> {
	// 每页显示多少条记录
	public static final int PAGE_SIZE = 3;
	// 要显示的数据
	private List<T> list;
	// 总记录数
	private int totalRecord;
	// 总页数
	private int totalPageNo;
	// 当前页
	private int pageNo;

	public Page(String pageNoStr, int totalRcord) {
		// 赋值总记录数
		this.totalRecord = totalRcord;
		
		// 根据总记录数计算总页数
		this.totalPageNo = this.totalPageNo / PAGE_SIZE + ((this.totalPageNo % PAGE_SIZE == 0) ? 0 : 1);
		
		// 指定 pageNo 默认值
		this.pageNo = 1;
		
		// 对pageNo进行赋值
		try {
			this.pageNo  = Integer.parseInt(pageNoStr);
		} catch (NumberFormatException e) {}
		
		// 对pageNo进行校正
		if(this.pageNo > this.totalPageNo) {
			this.pageNo = this.totalPageNo;
		}
		
		if(this.pageNo < 1) {
			this.pageNo = 1;
		}
		
	}

	// 是否有上一页
	public boolean isHasPrev() {
		return this.pageNo > 1;
	}

	// 是否有下一页
	public boolean isHasNext() {
		return this.pageNo < this.totalPageNo;
	}

	// 上一页
	public int getPrev() {
		return this.pageNo - 1;
	}

	// 下一页
	public int getNext() {
		return this.pageNo + 1;
	}

	public List<T> getList() {
		return list;
	}

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

	public int getTotalRecord() {
		return totalRecord;
	}

	public int getTotalPageNo() {
		return totalPageNo;
	}

	public int getPageNo() {
		return pageNo;
	}

}

在使用该Page类进行查询的时候,需要查询两次数据库。一次查询总记录数,另一次查询分页列表内容记录。

具体使用:

(1)只根据PageNo进行查询

查询总记录数:

public int getTotalRecord() {
    String sql = "select count(*) from book";
	long record = this.getSingleValue(sql);
	return (int) record;
}

查询List:

public List<Book> getPageList(int pageNo, int pageSize) {
	String sql = "select book_id bookId, book_name bookName, author, price, store_num storeNum, "
			+ "salse_amount salseAmount, img_path imgPath, category_id categoryId from book limit ?, ?";
	return this.getBeanList(sql, (pageNo - 1)*pageSize , pageSize);
}

使用:

int totalRcord = bookDao.getTotalRecord();
Page<Book> page = new Page<Book>(pageNoStr, totalRcord);
List<Book> list = bookDao.getPageList(page.getPageNo(), Page.PAGE_SIZE);
page.setList(list);

(2)带查询条件的分页

将查询条件封装为一个对象。

查询总记录数:

public int getTotalRecord(PageCondition pageCondition) {
	String sql = "select count(*) from book where price <= ? and price >= ? ";
	if(pageCondition.getCategoryId() != null) {
		sql += "and category_id =" + pageCondition.getCategoryId();
	}
	long record = this.getSingleValue(sql, pageCondition.getMaxPrice(), pageCondition.getMinPrice());
	return (int) record;
}

查询List:

public List<Book> getPageList(PageCondition pageCondition, int pageNo, int pageSize) {
	String sql = "select book_id bookId, book_name bookName, author, price, store_num storeNum, "
			+ "salse_amount salseAmount, img_path imgPath, category_id categoryId from book "
			+ "where price <= ? and price >= ? ";
	if(pageCondition.getCategoryId() != null) {
		sql += "and category_id = " + pageCondition.getCategoryId();
	}
	sql += " limit ?, ?";
	return this.getBeanList(sql, pageCondition.getMaxPrice(), pageCondition.getMinPrice(),(pageNo - 1)*pageSize , pageSize);
}

使用:

@Override
public Page<Book> getPage(PageCondition pageCondition) {
	int totalRcord = bookDao.getTotalRecord(pageCondition);
	Page<Book> page = new Page<Book>(pageCondition.getPageNoStr(), totalRcord);
	List<Book> list = bookDao.getPageList(pageCondition, page.getPageNo(), Page.PAGE_SIZE);
	page.setList(list);
	return page;
}

 

Hibernate分页:

 

mybatis分页:

转载于:https://my.oschina.net/javaGeeker/blog/675816

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值