分页介绍
分页就是将数据以多页去展示,使用分页可以提高用户的感受。
分页技术概述
物理分页(java开发常用)
- 在SQL查询时,从数据库只检索分页需要的数据
- 通常不同的数据库有着不同的物理分页语句
- MySQL物理分页,采用limit关键字
- 例如:检索11-20条 select* from user limit 10,10;
- 优点:不占用很大内存
- 缺点:效率比较低
逻辑分页
- 在SQL查询时,先从数据库检索出所有数据的结果集
- 在程序内,通过逻辑语句获得分页需要的数据
- 例如:检索11-20条 userList.subList(10,20);
- 优点:效率高
- 缺点:占有内存比较高
物理分页的实现
- 直接使用jdbc完成
- 使用滚动结果集,
- 优点:跨数据库。
- 缺点:性能低
- 使用数据库本身提供的分页操作
- 会使用每一个数据库特定的分页函数。
- 优点:性能高。
- 缺点:不能跨数据库。
- MySQL:limit
- sqlservlet:top
- oracle:rownum
limit使用
- select * from 表 limit m,n;
- m:代表的是从第几条开始 注意:它是从0开始记录的
- n:代表查询几条记录
- 示例:分页,每页显示6条,要查询第五页的数据
- select * from 表 limit (5-1)*6,6;
- select * from 表 limit (页码-1)*每页条数,每页条数;
//CustomerFindAllByPageServlet.java
//默认访问第一页
int pageNum=1;
//每页条数 人为定义
int currentPage= 5;
//调用service,完成查询当前页数据操作
CustomerService service = new customerService();
try{
PageBean pb=service.findByPage(pageNum,currentPage);
//将数据存储到reqest域,请求转到页面展示
request.setAttribute("pb",pb);
req.getRequestDispatcher("/showCustomerByPage.jsp").forward(req,resp);
}catch (SQLException e){
e.printStackTrace();
}
CustomerService.java
//分页操作
//pageNum 页码
//currentPage 每页条数
public PageBean findByPage(int pageNum,int currentPage) throws SQLException{
PageBean pb = new PageBean();
List<Customer> cs= dao.findByPage(pageNum,currentPage);
//查询总条数
int totalCount=dao.findAllCount();
//得到总页数
int totalPage = Math.ceil(totalCount*1.0/currentPage);
pb.setTotalCount(totalCount);//封装总条数
pb.setTotalPage(totalPage);//封装总页数
pb.setCs(cs);//封装当前页数据
pb.setCurrentPage(currentPage);//封装每页条数
pb.setPageNum(pageNum);//封装当前页码
return pb;
}
//CustomerDao
//pageNum 页码
//currentPage 每页条数
public List<Customer> findByPage(int pageNum,int currentPage) throws SQLException{
String sql = "select * from customer limit ?,?";
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
reutrn runner.query(sql,new BeanListHandler<Customer>(Customer.class),(pageNum-1)*currentPage,currentPage)
}
//查询总条数
public int findAllCount(){
String sql = "select count(*) from customer";
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
long count = (long) runner.query(sql,new ScalarHandler());
return (int) count;
}
分页代码实现
- 在success.jsp页面上
<a href = "${pageContext.request.contextPath}/findAllByPage">查看所有客户信息(分页展示)</a><br>
- 创建CustomerFindAllByPageServlet完成分页
- 问题:要向页面携带的数据有很多,不仅是要展示的数据,例如:页码,总页数等,都需要携带到页面上。
- 解决方案:创建一个分页Bean,在这个Bean中封装所有关于分页相关的数据。
public class PageBean{
private int pageNum;//当前页码
privete int numPerPage;//每页记录条数
private int totalCount;//总记录条数
private int totalPageNum;总页数
private List<Customer> customers;//当前页需要数据
//get,set方法
}