很多时候我们写DAO层接口会写一个查询所有记录的方法,但是在数据量非常大的时候,查询所有记录会巨慢无比,这时我们就需要用到分页查询。pagehelper就是个很好的分页插件。
1,配置
pagehelper的项目地址:地址
我们只需在Maven中加入如下依赖即可:
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.1</version></dependency>
2,执行分页查询
首先这里先写好DAO和Mapper XML的查询全部部分:
Mapper XML的select节点:
<selectid="getAll"resultMap="userResultMap"> select * from `user` </select>
DAO:
/*** 获取全部用户*/List<User>getAll();
User类表示一个用户的POJO类。
然后在Service中写一个查询指定页的用户的方法:
privateUserDAOuserDAO; /*** 查询用户** @param pageNum 当前页码* @param pageSize 一页的记录数*/publicPage<User>getUserList(intcurrentPage, intpageSize) { Page<User>userPage=PageHelper.startPage(currentPage, pageSize).doSelectPage(() ->userDAO.getAll()); returnuserPage; }
使用PageHelper
类即可很轻松的进行分页查询了!可见PageHelper
的startPage
方法用于指定要获取的当前页码和一页的记录数,startPage
这个方法就设定了分页查询的基本参数,返回了个PageMethod
对象,然后在此基础上,执行PageMethod
对象的doSelectPage
方法,这个方法中通过lambda语句执行我们Mybatis的查询全部方法,这样内部就自动完成了分页逻辑,并返回了指定页码的数据记录。
最后查询的结果是个Page对象,这个对象有如下方法:
getPageNum
获取当前的页码getPages
获取总页数getTotal
获取总记录数getResult
获取当前页的数据记录,为一个List集合
所以在Controller中我们就可以通过调用Service取得结果的Page对象后,再调用getResult方法获取这一页的数据:
//查询第一页数据,每一页15条记录userService.getUserList(1, 15).getResult();
上述startPage
方法第一个参数写0和1是一样的,都表示获取第一页。
3,优化分页模型
实际业务中通常会自己封装一个类表示我们分页查询后的结果:
importcom.github.pagehelper.Page; importlombok.Getter; importlombok.NoArgsConstructor; importlombok.Setter; importjava.io.Serializable; importjava.util.List; /*** 分页查询结果模型,存放整个结果分页基本信息和当前页信息以及内容*/publicclassPaging<T>implementsSerializable { /*** 当前页*/privateintcurrentPageNum; /*** 总页数*/privateinttotalPageNum; /*** 每页记录数量*/privateintpageSize; /*** 总记录数*/privatelongtotalCount; /*** 当前页记录集合*/List<T>dataCurrentPage; /*** 传入Page结果对象构造Pageing对象** @param pageResult 分页查询结果Page对象*/publicPaging(Page<T>pageResult) { this.currentPageNum=pageResult.getPageNum(); this.totalPageNum=pageResult.getPages(); this.totalCount=pageResult.getTotal(); this.pageSize=pageResult.getPageSize(); this.dataCurrentPage=pageResult.getResult(); } }
这里封装了一个Paging
类,表示我们查询的分页结果类。然后改造上述Service的方法如下:
privateUserDAOuserDAO; /*** 查询用户** @param pageNum 当前页码* @param pageSize 一页的记录数*/publicPaging<User>getUserList(intcurrentPage, intpageSize) { Page<User>userPage=PageHelper.startPage(currentPage, pageSize).doSelectPage(() ->userDAO.getAll()); Paging<User>userPaging=newPaging<User>(userPage); returnuserPaging; }
让Service处理我们得到的分页结果Page
对象中所需要的属性,并放入我们自己的分页模型Paging
并返回,这样更加方便。