一、分页的三种思路
1.纯js实现分页。
一次性查询记录并加载到html的table中,然后通过选择性地显示某些行来达到分页显示的目的。(首先:用table来显示查询出来的记录们,全部显示。 然后,在JS中修改table中某些行显示,某些行隐藏。)这是一种伪分页,只能用于数据少的情况下。一旦数据多了,十几万条数据加载到html中会变得很慢。而且不实时,一次加载完后数据就写死在页面了,若数据库中有变化,浏览器端显示的仍是上次加载过来的数据。
2.一次查询,分批显示。
我们可以执行一个数据库查询操作,得到结果集。然后,通过指针的移动来显示当前页面的记录。(当前页面号*每页记录数)定位到当前页的第一条记录,然后通过while循环显示n条记录(n为每页显示记录数)。在跳页时,只需修改currentPage,即可在重定位到下一页时把当前页面号改掉,重新定位记录指针,通过while遍历显示n条记录。与JS选择性显示不同,这里是选择性遍历。与JS分页不同的是,这里分页每次跳页修改的是遍历的指针,每次跳页都要进行一次全面查询。同样地,不适合大数据量查询。这里比JS分页优化的地方在于——实时性。每次跳页都会查询一次数据库,保证数据的实时性。
3.在服务端分页。跳到第n页才查询、显示第n页内容。
要点就是根据客户端表格的“页面”计算出数据库要查询的当前页面的第一条记录的位置。优点:实时性:跳页才查询。数据量小:只加载当前页的记录进行显示。重点在于两条语句:select count(*) from ...:查询得到记录总条数select * from .. limit pageNo,rowsCount:查询从第pageNo条开始的rowsCount条数据。
二、MyBatis分页插件PageHelper
分页
总页数、每页多少条、当前页数、记录总数
只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。
public PageInfo<PersonInfoDto> queryPersonInfo(PersonRequest request, PageInfo pageInfo){
//pageNum 页码pageSize 每页显示数量
Page<PersonInfoDomain> page = PageHelper.startPage(pageInfo.getPageNum(), pageInfo.getPageSize());
List<PersonInfoDomain> list = personInfoDao.selectPersonInfo(request);
PageInfo<PersonInfoDto> personInfoDtoPageInfo = new PageInfo<PersonInfoDto>(page.getPageNum(), page.getPageSize(), page.getTotal());
personInfoDtoPageInfo.setList(PersonInfoConverter.toPersonInfoDto(list));
return personInfoDtoPageInfo;
}