mybatis-plus分頁無效, total=0問題(springmvc)


前言

項目中(springmvc)分頁采用mybatis-plus, 頭一回用, 就遇到了如題問題

pom.xml

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.2.0</version>
</dependency>

mapper繼承了BaseMapper

@Repository
public interface UserMapper extends BaseMapper<UserPo>{
  // 這里代碼沒用, 查詢采用的BaseMapper中的 IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

service層

    @Override
    public SysUserVo list(UserQo qo) {
        QueryWrapper<UserPo> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", qo.getKeyword())
                .or().
                like("code", qo.getKeyword());
        Page<UserPo> page = new Page<>(qo.getPageNo(), qo.getPageSize());
        IPage<UserPo> userPoIPage = userMapper.selectPage(page, queryWrapper);
        List<UserPo> records = userPoIPage.getRecords();
        long total = userPoIPage.getTotal();// 總記錄數
        long pages = userPoIPage.getPages();// 查詢結果數
        long pageNo = userPoIPage.getCurrent();// 當前頁
        long pageSize = userPoIPage.getSize();// 每頁條數
        List<UserVo> userVos = Lists.newArrayList();
        for (UserPo userPo : records) {
            Integer userId = userPo.getId();
            List<RolePo> roles = userMapper.selectRoles(userId);
            UserVo userVo = UserVo.builder().code(userPo.getCode())
                    .name(userPo.getName())
                    .rolePo(roles)
                    .status(userPo.getStatus())
                    .build();
            userVos.add(userVo);
        }
        SysUserVo sysUserVo = SysUserVo.builder()
                .list(userVos)
                .total(total)
                .build();
        return sysUserVo;
    }

結果分頁並沒有生效, 於是添加攔截器

package com.cebbank.api.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan("com.cebbank.api.mapper")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 設置請求的頁面大於最大頁后操作, true調回到首頁,false 繼續請求  默認false
        paginationInterceptor.setOverflow(true);
        // 設置最大單頁限制數量,默認 500 條,-1 不受限制
        paginationInterceptor.setLimit(100);
        // 開啟 count 的 join 優化,只針對部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        paginationInterceptor.setDialectType("mysql");
        return paginationInterceptor;
    }
}

還是沒生效

最后找到解決方案, 在數據源配置中顯式添加分頁插件

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
        sqlSessionFactoryBean.setConfiguration(configuration);
//        sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations());
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PaginationInterceptor()});

        return sqlSessionFactoryBean.getObject();
    }

完整配置

package com.cebbank.api.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
 * @author linyong
 * @date 2020/7/30 16:38
 * @description 數據源配置
 **/
@Configuration
@EnableAspectJAutoProxy
@MapperScan("com.cebbank.api.mapper")
public class DBConfig {

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.initialSize:5}")
    private Integer initialSize;

    @Value("${spring.datasource.maxActive:50}")
    private Integer maxActive;

    @Value("${spring.datasource.maxWait:60000}")
    private Integer maxWait;

    @Value("${spring.datasource.minIdle:5}")
    private Integer minIdle;

    @Value("${spring.datasource.testWhileIdle:true}")
    private Boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow:true}")
    private Boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn:true}")
    private Boolean testOnReturn;

    @Value("${spring.datasource.validationQuery:select 1}")
    private String validationQuery;

//    @Value("${mybatis.mapper-locations}")
//    private String mapperLocations;


    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setInitialSize(initialSize);
        druidDataSource.setMaxActive(maxActive);
        druidDataSource.setMaxWait(maxWait);
        druidDataSource.setMinIdle(minIdle);
        druidDataSource.setTestWhileIdle(testWhileIdle);
        druidDataSource.setTestOnBorrow(testOnBorrow);
        druidDataSource.setTestOnReturn(testOnReturn);
        druidDataSource.setValidationQuery(validationQuery);
        return druidDataSource;
    }

//    private Resource[] resolveMapperLocations() {
//        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
//        String[] arr = mapperLocations.split(",");
//        List<String> locations = Arrays.asList(arr);
//        List<Resource> resources = new ArrayList();
//        if (locations != null) {
//            for (String mapperLocation : locations) {
//                try {
//                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
//                    resources.addAll(Arrays.asList(mappers));
//                } catch (IOException e) {
//                    // ignore
//                }
//            }
//        }
//        return resources.toArray(new Resource[resources.size()]);
//    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
        sqlSessionFactoryBean.setConfiguration(configuration);
//        sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations());
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PaginationInterceptor()});

        return sqlSessionFactoryBean.getObject();
    }


    @Bean
    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource());
        return transactionManager;
    }

}

問題解決

 

 

感謝

【MP插件】- mybatis-plus分頁無效、total、pages為0的問題

mybatis plus分頁total=0、不計算總數的終極解決方案!!!

SpringMVC+MyBatis分頁插件簡單實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM