第一篇文章打算写一下pageHelper,因为在最近的一个项目里使用pageHelper进行分页时遇到了一系列的问题,害得我在分页的问题上花了近两天的时间处理。 pageHelper是国内非常优秀的一款开源的mybatis分页插件,在这就不介绍原理了,直奔问题。首先,不要忘记加上依赖,其次不要忘记进行配置
<!--分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency> pagehelper: helper-dialect: postgresql #指定分页插件使用哪种方言# reasonable: true #分页合理化参数,默认false会根据参数进行查询。当参数为true时,pageNum<=0会查询第一页,pageNum>总数时会查询最后一页。# support-methods-arguments: true #支持通过 Mapper 接口参数来传递分页参数# params: count=countsql #增加了该参数配置映射,用于从对象中根据属性名取值# page-size-zero: true #默认false,当设置为true时,如果pageSize=0就会查询出全部的结果#然后我们直接来说问题。 第一个问题,分页失效:使用pageHelper时重要的第一步就是使用PageHelper.startPage(pageNum,pageSize)进行真正意义上的分页,分页失效的主要原因之一就是这个方法的位置不正确。PageHelper.startPage(pageNum,pageSize)这段代码下面的查询语句必须是你所要分页的查询语句。举个例子,下面代码中,有效分页只针对queryApplications方法查询的数据进行分页,而对其他的查询方法无效。
PageHelper.startPage(pageNum, pageSize); List<ApplicationDto> applicationDtoList = customQueryDao.queryApplications(applicationDto); List<ApplicationDto> applicationDtoList1 = customQueryDao.queryApplications1(applicationDto);第二个问题,分页之后缺少或多余重复数据:举个例子,你的数据库中有21条数据,按每页10条进行分页,在你取出这些数据之后你可能要删掉2条数据,但是在你查询这21条数据时已经完成了分页,所以在你删掉2条数据剩19条后,分页还是3页,这就出现了每页数量不是10的现象。 我之前的项目就是再这个问题上纠结了好久,我的业务是这样的,我需要从一个数据库视图中查出所有数据,因为视图中的每一条数据都是几个主字段对应几个辅字段,例如下图: 也就是说我需要在代码中进行大量的合并去重再删除掉不满足某些条件的数据,这就使我的分页没有了意义,所以解决这个的办法就是我在第一个查询中只查出每个主数据,这是进行分页的数据,查询如下,
@Select("<script>" + "select distinct application_id " + "from " + "dsmp.dsmp_application_view " + "<where> " + 查询条件 "</where> " + "order by application_id " + "</script>") List<ApplicationDto> queryApplications(@Param("applicationDto") ApplicationDto applicationDto);另外再写一条查询语句查出所有数据进行处理,如下,
@Select("<script>" + "select distinct account_id " + "from dsmp.dsmp_account_view " + "<where> " + 查询条件 "</where> " + "order by account_id " + "</script>") List<AccountAllConditionsList> queryAccounts1(@Param("accountDto") AccountDto accountDto, @Param("sourceTimeDto") SourceTimeDto sourceTimeDto);最后按id进行遍历,将第二条查出并处理之后的数据set到第一条查询出的数据也就是分页过了的数据中。
if(!CollectionUtils.isEmpty(applicationDtoList) && !CollectionUtils.isEmpty(applicationDtoList1)){ for (ApplicationDto a : applicationDtoList) { for (ApplicationDto a1 : applicationDtoList1) { if(a.getApplicationId() != null && a.getApplicationId().equals(a1.getApplicationId())){ a.setIpAddress(a1.getIpAddress()); a.setIsadmit(a1.getIsadmit()); a.setUserName(a1.getUserName()); a.setApplicationName(a1.getApplicationName()); } } } }最后放入pageInfo 中,并进行返回。
PageInfo<ApplicationDto> pageInfo = new PageInfo<>(applicationDtoList);关注微信公众号:非定义式程序员,我们一起解决项目中遇到的更多问题。