介绍
分页功能是web应用开发中必要的基础功能,在FDP中这一功能被很好的封装起来,主要使用的就是 Page 分页类。
他配合Service层、Dao层的接口,配合MyBatis的拦截器,配合 page.jsp 模板,实现了一套完整的分页功能。
基本原理
对select语句进行拦截,生成求总数的select conut(*) ...语句来计算出“总条数”,已知“每页条数”,可计算出“总页数”。如果要查第2页,可计算出开始行和结束行,执行SQL查出某一页数据。
核心类
com.sicheng.common.persistence.Page 分页类
com.sicheng.common.persistence.interceptor.BaseInterceptor Mybatis分页拦截器基类
com.sicheng.common.persistence.interceptor.PaginationInterceptor
Mybatis的分页插件:
PaginationInterceptor,会自动拼接sql计算总记录数,生成分页的SQL。
模板
/hcxc/src/main/webapp/WEB-INF/views/front/include/page.jsp
模板可用于在页面中显示成“分页导航条”,如果“分页导航条”有多种不同的样子,可编写多个模板。
Page 分页类中有分页所需要的全部参数,把这些参数通过“模板”渲染出来,显示在页面上。
本分页程序的特点
- 带参数的分页:生成的分页导航条中的每一页使用的是<a href=""/>标签,并带有所有查出的条件参数。例如查“用户”表,按过滤条件:省份=北京市,查询出用户列表。点击“第2页”,应当带参数:省份=北京市 进行翻页, 查出省份=北京市的数据的第2页。
- SEO友好:生成的分页导航条中的每一页使用的是<a href=""/>标签,搜索引擎的爬虫可以抓取到“下一页”。
- 模板:可通过模板渲染出多种不同的“分页导航条”
使用方法
一般在Controller类中使用Page分页类。
并且把Page对象放入view层,用于从page中一页数据,并且显示“分页导航条”
有一个“图书”表,bookService是服务层,bookDao是Dao层。
Page<Book> page = bookService.selectByWhere(new Page<Book>(request, response), book); model.addAttribute("page", page);
在Service层,把Page对象放在实体对象中传递
book.setPage(page); page.setList(bookDao.findPage(book));// 执行分页查询
/** * 查询分页数据 * 查询数据列表,如果需要分页,请设置分页对象,如:entity.setPage(new Page<T>()); * @param page 分页对象 * @param entity 查询条件,可为null。或new一个实体对象,用于控制order by 排序、控制del_flag、控制distinct * @return */ public Page<T> selectByWhere(Page<T> page, T entity) { entity.setPage(page); List<T> list=dao.selectByWhere(entity); if(page==null){ page=new Page<T>(); } page.setList(list); return page; }
在jsp页面上显示分页导航条--使用模板
< div class = "wrap" >
<%@ include file = "/WEB-INF/views/front/include/page.jsp" %>
</ div >
在jsp页面上显示分页导航条--使用Page类中自带的固定的导航条模板
< div class = "pagination" > ${page} </ div >
Page 分页的技巧
pageSize=-1 表示不分页
count=-1 表示不查询总数,可用于提高性能,但不能显示“总记录数”,超出后会查不出数据。适合海量数据的分页,如有100万条数据,页面上只有一个“下一页”按钮,用户一直点就一直翻页。直到返回空数据时停止。
count>0 表示已通过其它途径获得了conut总条数,不再需要再查询总条数,节省性能。适海量数据的分页,如有100万条数据,用户不可能从第1页翻到最后一页,可以只让用户查前100页(2000条)。