分页是每个项目都会用到的,所以它的重要性不言而喻,这里整理一套封装好的分页工具,在项目中直接使用就好。
一、分页分析
首先应该了解分页查询语句(MySQL为例):
select * from table_test
LIMIT -- 分页查询关键字
0, -- 从第几条数据开始查询数据【(当前页数-1)* 每页显示的条数】
10; -- 每页显示的条数
页面显示的分页工具的形式:
**当前页 1/10 首页 上一页 每页显示 10 下一页 末页**
看到前面的信息可以总结出需要往后台传递的数据是:当前页,每页显示条数
二、封装工具类
这里的工具类其实首先是一个分页的bean,因为我们要传递的数据不是一个,所以用一个PageBean封装分页属性:
public class PageBean<T>{
private int currentPage = 1; //当前页,默认是第一页
private int pageCount = 10; //每页显示的条数,默认是10条
private int totalPage; //总页数
private int totalCount; //数据总条数
private List<T> pageData; //查询到的数据对象集合
//省略getter、setter方法
……
//主要说一下总页数的getter方法
public int getTotalPage(){
//计算公式:总记录数%每页显示条数=0时
if(totalCount % pageCount == 0){
totalPage = totalCount / pageCount;
}else{
//计算公式:总记录数%每页显示条数!=0时
totalPage = totalCount / pageCount + 1;
}
return totalPage;
}
}
三、使用分页工具
封装好PageBean之后就可以在项目中直接使用了,在Dao层封装分页查询的方法,传入PageBean就可以了
public void getAll(PageBean<T> pb){
//为PageBean对象的属性赋值
//1、查询总记录数,放入totalCount
int totalCount = this.getTotalCount();
pb.setTotalCount(totalCount);
//2、处理当当前页是第一页和最后一页时的问题
if(pb.getCurrentPage() <= 0){
//如果当前页不大于0,显示第一页
pb.setCurrentPage(1);
}else if(pb.getCurrentPage() > pb.getTotalPage()){
//如果当前页大于最大页数,显示最后一页
pb.setCurrentPage(pb.getTotalPage());
}
//获取当前页,查询数据
int currentPage = pb.getCurrentPage();
//查询的起始行
int index = (currentPage - 1) * pb.getPageCount();
//每页显示的条数
int count = pb.getPageCount();
//查询的sql语句
String sql = "select * from table_test LIMIT ?,?";
try{
//使用dbutil组件
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//查询当前页数据
//QueryRunner对象的query方法参数说明:
//第一个:查询的sql
//第二个:查询的返回结果,直接使用接口中声明好的BeanListHandler就行,注意是泛型,具体到业务的时候指定具体的泛型类型
//第三个:这个参数是一个可变参数,就是传入sql语句中占位符的实参
List<T> pageData = qr.query(sql, new BeanListHandler<T>(T.class),index,count);
pb.setPageData(pageData);
}catch(Exception e){
throw new RuntimeException();
}
}
//查询总记录数的方法
public int getTotalCount(){
String sql = "select count(*) from table_test";
try{
//这里使用DbUtils组件,如果有不清楚的可以+QQ:3393055745
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//QueryRunner的query方法传入的两个参数:
//第一个:查询sql
//第二个:使用接口封装好的对象就可以,这里使用的对象的意思是返回查询结果的第一条数据
Long count = qr.query(sql,new ScalarHandler<Long>());
return count.intValue();
}catch(Exception e){
throw new RuntimeException();
}
}
查询方法封装好之后就是从前台页面传数据了,剩下的就是jsp和后台数据的交互了,就不介绍了。。。