最近做一个后台项目,遇到了关于分页的问题,昨天下午开始一直在弄,弄到晚上12点也没弄好,刚才在睡午觉的时候一下有了解决方案,现在已经解决,心想必须写一篇博客。一来是记录解决思路与方法;二来是分享给需要的朋友们。
需求
在springboot项目中,利用pageHeolper插件来实现分页操作。
方法步骤
1.首先在pom文件中引入pageHelper分页插件的jar包。
2.配置application.properties.
解释
**pagehelper.helperDialect:**分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插 件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
**pagehelper.reasonable:**分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
**pagehelper.supportMethodsArguments:**支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
**pagehelper.params:**为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
*注意:*更多配置参数请访问pagehelper在github上的官方文档——https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
3.使用分页插件。
作者的项目是采用MVC分层,所以在Controller中使用pageHelper.
如图所示,
第一步在调用service查询方法之前使用:
Page page = PageHelper.startPage(pageNumber,2); //pageNumber为传入的第几页的参数,2为每页大小
第二步在返回值之前使用:PageInfo info = new PageInfo(page,5); //page为要包装的数据,5为连续显示的页数
info.setList(orderVOList);
第三步返回info。
遇到的问题以及解决方法
问题1:调用PageHelper.startPage(pageNumber,2)后依然无法实现数据分页.
原因:作者刚开始引入的是官网上说明的jar包形式,如下:
解决方法:springboot项目要引入上文所提供的jar包形式。
*问题2:*在使用PageInfo包装分页后的数据后出错,导致拿到的数据不正确。
原因:作者在使用了PageHelper.startPage(pageNumber,2)实现分页后,又使用了Lambda表达式,pageHelper在使用Java 8 中的Lambda表达式后,数据会出错。
解决方法:先将PageHelper.startPage(pageNumber,2)分页后的数据赋值给一个Page对象:
Page page = PageHelper.startPage(pageNumber,2);
然后用PageInfo包装page:
PageInfo info = new PageInfo(page,5);
此时得到的info对象里面数据集合list会出现错误我们可以使用set方法将查询到的正确的数据集合set进去:
info.setList(orderVOList);
最后得到的info对象就是成功实现了分页的,可以return出去了。
如果查询过程中没有使用Lambda表达式
如果查询过程中没有使用Lambda表达式,springboot实现分页更加简单。
PageHelper.startPage(pageNumber,2);
调用service查询列表方法,例如
List orderModelList = orderService.orderModelList();
用PageInfo封装得到的数据集合
PageInfo info = new PageInfo(orderModelList);
返回info
**感想:*编程最重要的是思路,在敲代码之前一定要想好思路,理清思路,要敢于不断的去试错,并在错误中总结和搞清楚原理。在遇到困难时要敢于去想解决方法,不断尝试,如果经过很久都没弄出来,最好的办法是休息,休息的过程和结果有时会有意想不到的惊喜(比如突然冒出来的解决思路和办法和休息后的清晰思路)。