介绍

分页功能是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 分页类中有分页所需要的全部参数,把这些参数通过“模板”渲染出来,显示在页面上。

本分页程序的特点

  1. 带参数的分页:生成的分页导航条中的每一页使用的是<a href=""/>标签,并带有所有查出的条件参数。例如查“用户”表,按过滤条件:省份=北京市,查询出用户列表。点击“第2页”,应当带参数:省份=北京市 进行翻页, 查出省份=北京市的数据的第2页。
  2. SEO友好:生成的分页导航条中的每一页使用的是<a href=""/>标签,搜索引擎的爬虫可以抓取到“下一页”。
  3. 模板:可通过模板渲染出多种不同的“分页导航条”

使用方法

一般在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条)。