使用Mybatis-Plus进行分页查询,返回的数据中total总是为0

本文介绍了Mybatis Plus中分页插件配置的方法,包括3.4版本之前的配置方式及3.4之后的新配置方式,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题的出现是因为我们没有配置mp插件的一个bean

解决:在配置文件中进行的bean的配置即可

 3.4以前版本

@Configuration
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

 3.4以后版本:

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

配置完重启服务器即可

<think>嗯,用户遇到了MyBatis-Plus分页查询返回全部数据的问题,需要找出原因和解决方案。首先,我应该回顾一下MyBatis-Plus的分页机制。记得MyBatis-Plus的分页插件需要正确配置才能生效,可能用户没有配置或者配置不正确。 用户提到的返回全部数据,而不是分页后的结果,常见的原因有几个。首先,可能分页插件没有正确注册到MyBatis的拦截器中,导致分页逻辑没有被执行。这时候即使代码里写了Page对象,实际执行的SQL还是全量查询。需要检查是否在配置类里添加了分页插件的Bean,比如使用@Bean和Interceptor,或者通过XML配置。 另一个可能是分页参数传递的问题。比如,在Service层或Mapper层的方法中,没有正确将Page对象作为第一个参数,导致分页信息没有被处理。此外,如果手动封装了Page对象但参数设置错误,比如current和size没传对,也可能导致total0或者不分页。 还有可能是数据库方言的问题。MyBatis-Plus需要知道当前使用数据库类型来生成正确的分页SQL,如果配置的方言不对,可能会生成错误的SQL语句,导致分页失效。例如,MySQL和PostgreSQL的分页语法略有不同,需要正确设置方言。 另外,用户可能引用了多个数据源,但分页插件没有在对应的数据源中配置。比如,多数据源环境下,每个数据源都需要单独配置分页插件,否则分页可能不会生效。 解决方案的话,首先应该确认分页插件是否正确配置。可以检查是否有@Configuration类,里面定义了PaginationInterceptor(旧版本)或MybatisPlusInterceptor(新版本)并添加了分页的InnerInterceptor。然后检查Mapper接口的方法是否正确使用Page参数,比如方法参数是否正确,返回类型是否为Page。接着验证数据库方言是否正确设置,尤其是在多数据源的情况下。最后,检查是否在Controller或Service层正确创建了Page对象,传递了正确的current和size参数。 用户提供的引用中,提到了多数据源的配置问题,分页查询的三种方法,以及Page返回total0的问题。这些都需要综合考虑。比如引用[1]提到多数据源需要单独配置分页插件,这可能是一个关键点。引用[3]则指出配置类的问题,可能用户没有正确添加分页插件导致total0,进而分页失败,返回全部数据。 总结下来,可能的原因包括分页插件未配置、配置不正确、多数据源未分别配置、参数传递错误或数据库方言问题。解决方案应逐步检查这些方面,确保分页插件正确注册,参数正确传递,方言设置正确,并在多数据源环境下分别配置插件。</think>### MyBatis-Plus分页查询返回全部数据的原因及解决方案 #### 原因分析 1. **分页插件未正确配置** MyBatis-Plus的分页功能依赖拦截器`PaginationInnerInterceptor`(新版本)或`PaginationInterceptor`(旧版本)。若未在配置类中注册该插件,分页逻辑将不会生效,导致查询返回全部数据[^1][^3]。 2. **多数据源未单独配置分页插件** 若项目中存在多个数据源,需为每个数据源单独配置分页插件。未配置的数据源下执行的分页查询会失效[^1]。 3. **分页参数传递错误** - Mapper接口方法未将`Page`对象作为第一个参数。 - Service层未正确调用`page()`方法,或手动封装`Page`对象时参数(如`current`、`size`)错误[^2][^3]。 4. **数据库方言未匹配** 分页插件需根据数据库类型生成特定分页SQL(如MySQL的`LIMIT`)。若未正确配置方言,可能导致生成的SQL不包含分页逻辑。 --- #### 解决方案 ##### 1. 检查分页插件配置 **旧版本(MyBatis-Plus < 3.4.0)** ```java @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` **新版本(MyBatis-Plus ≥ 3.4.0)** ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 根据数据库类型设置 return interceptor; } } ``` ##### 2. 多数据源需分别配置插件 若使用数据源,需在每个数据源的配置类中单独添加分页插件: ```java @Bean public DataSource dataSource1() { /* 数据源1配置 */ } @Bean public SqlSessionFactory sqlSessionFactory1() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource1()); factoryBean.setPlugins(new MybatisPlusInterceptor()); // 添加分页插件 return factoryBean.getObject(); } ``` ##### 3. 正确使用分页方法 **Mapper层接口定义** ```java // 方法1:使用Page对象作为参数 Page<User> selectPage(Page<User> page, @Param("name") String name); // 方法2:Service层调用page()方法 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public Page<User> listUsers(Page<User> page) { return page(page, new QueryWrapper<User>().eq("status", 1)); } } ``` **Controller层调用** ```java @GetMapping("/users") public Result<Page<User>> getUsers(@RequestParam(defaultValue = "1") int current, @RequestParam(defaultValue = "10") int size) { Page<User> page = new Page<>(current, size); return Result.success(userService.listUsers(page)); } ``` ##### 4. 验证SQL日志 启用MyBatis日志,检查生成的SQL是否包含分页语句(如`LIMIT 10`)。若无分页逻辑,需检查插件配置或数据库方言设置。 --- #### 补充说明 - **total0的问题**:若分页查询返回的`total`为0,通常是因为分页插件未配置或Mapper方法返回类型错误(应为`Page<T>`而非`List<T>`)。 - **性能优化**:大数据量分页建议使用`PageHelper`物理分页或优化SQL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值