1. 程式人生 > >SpringBoot+Mybatis+PageHelper分頁(踩坑-total總數有誤)

SpringBoot+Mybatis+PageHelper分頁(踩坑-total總數有誤)

方式一:使用原生的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