SpringBoot+Mybatis+PageHelper分頁(踩坑-total總數有誤)
阿新 • • 發佈:2018-12-08
方式一:使用原生的PageHelper(親測OK)
1.在pom.xml中引入依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
2.在springboot的啟動類(Application.java)裡面注入配置
@Bean public PageHelper pageHelper(){ PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("offsetAsPageNum","true"); properties.setProperty("rowBoundsWithCount","true"); properties.setProperty("reasonable","true"); properties.setProperty("dialect","mysql"); pageHelper.setProperties(properties); return pageHelper; }
方式二:使用PageHelper的starter(未測)
1.在pom.xml中引入依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
2.在application.properties配置pagehelper的屬性
#pagehelper分頁外掛配置 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql
前置均一樣
最後就是使用pagehelper進行分頁了,其中最重要的一句就是
PageHelper.startPage(pageNum,pageSize);
pageNum:當前頁數 pageSize:當前頁需要顯示的數量
後面應緊跟資料庫查詢語句。
一般在PageHelper.startPage之後一條SQL句就能結束查詢的業務場景,此處便不會出現total以及totalPages數量不對的問題。
我碰到的問題是因業務無法一條SQL來結束
/** * 根據條件獲取裝置概覽資訊 * * @param conditionForQueryDeviceInfoBO 用以獲取裝置資訊的條件 * @author zhangs * @createDate 2018/04/09 */ @Override public PageInfo<DeviceReturnWebVO> queryDeviceByCondition(ConditionForQueryDeviceInfoBO conditionForQueryDeviceInfoBO) { log.info(Thread.currentThread().getStackTrace()[1].getMethodName() + "=====根據條件獲取裝置概覽資訊====:" + JSON.toJSONString(conditionForQueryDeviceInfoBO)); List<DeviceReturnWebVO> deviceReturnWebs = new ArrayList<>(); /** * 獲取裝置概要資訊 */ long startTime = System.currentTimeMillis(); PageHelper.startPage(conditionForQueryDeviceInfoBO.getPageNumber(), conditionForQueryDeviceInfoBO.getPageSize()); List<DeviceReturnWebVO> page = iDeviceManageDao.queryDeviceByCondition(conditionForQueryDeviceInfoBO); PageInfo<DeviceReturnWebVO> pageInfo = new PageInfo<>(page); long chapter1Time = System.currentTimeMillis(); log.info(Thread.currentThread().getStackTrace()[1].getMethodName() + "===根據條件獲取裝置概覽資訊===耗時:" + (chapter1Time - startTime) + "ms===List<DeviceReturnWebVO>:" + JSON.toJSONString(page)); if (page != null && page.size() > 0) { Map<String, Object> params = new HashMap<>(); params.put("status", DataStatusEnum.DATA_STATUS_ENABLE.getStatusCode()); for (DeviceReturnWebVO deviceReturnWebVO : page) { String deviceType = deviceReturnWebVO.getDeviceType(); String uId = deviceReturnWebVO.getuId(); deviceReturnWebVO.setDeviceTypeName(DeviceTypeInfoEnum.getDescription(deviceType)); //查詢二級裝置資訊以及分組資訊 params.put("uId", uId); deviceReturnWebVO.setSecondDeviceReturnWebs(iSecondaryDeviceInfoDao.getSecondByUId(params)); deviceReturnWebs.add(deviceReturnWebVO); } pageInfo.setList(deviceReturnWebs); } long chapter2Time = System.currentTimeMillis(); log.info(Thread.currentThread().getStackTrace()[1].getMethodName() + "===根據條件獲取裝置概覽資訊==子級裝置資訊===耗時:" + (chapter2Time - chapter1Time) + "ms ===content:" + JSON.toJSONString(deviceReturnWebs)); return pageInfo; }
若如上程式碼一樣,有多個dao來查詢資料庫,在new PageInfo()時總數會有bug,需做處理,可在生成了正確的pageInfo後在進行查詢以及setList