MyBatisPlus分页查询踩坑小记

本文详细解答了在使用MyBatisPlus框架进行分页查询时遇到的常见问题,包括selectPage()方法未自动添加limit的问题,自定义分页查询无效以及selectMapsPage()方法返回数据类型转换失败的情况,提供了具体的解决步骤和代码示例。

记录下

Q1:使用MyBatis中selectPage()查询语句,没有limit

源代码中的方法:

IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

解决方法:

步骤1:检查pom依赖,没有则添加

    <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.boot.starter.version}</version>
    </dependency>

步骤2:配置分页类

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * create by FenQing1213
 **/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

步骤3:controller层和dao层代码这里省略,service代码实现如下

public Result query(QuerySomeThing query) {
        QueryWrapper<QuerySomeThing> queryWrapper = new QueryWrapper();
        queryWrapper.like("lie_ming", query.getKeywords())
                .orderByAsc("id");
        Page<QuerySomeThing> page = new Page<>(1,10); // 第一个参数是pageNum,第二个参数是pageSize
        IPage<QuerySomeThing> iPage = yourMapperName().selectPage(page, queryWrapper); // 调用mybatis中自带的查询分页方法
        List<QuerySomeThing> records = iPage.getRecords();
        return records;
    }

Q2:MybatisPlus自定义分页查询,没有limit

起初按照百度的方法,使用自定义的分页查询,但是看执行SQL,语句中还是没有limit

解决方法

按照Q1中提到的步骤1、2,新增一个配置类即可。

Q3:MyBatisPlus中selectMapsPage()返回数据没有转化

源代码的方法:

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

解决方法

用selectPage不好吗?

<think>好的,我现在需要帮助用户查找MyBatisPlus分页查询的示例和使用方法。首先,用户的问题是关于MyBatisPlus分页查询的具体实现步骤,可能包括配置和代码示例。我应该先回忆一下MyBatisPlus分页机制,然后结合用户提供的引用内容来组织回答。 根据用户提供的引用,特别是引用[1]和[2],MyBatisPlus分页插件是通过拦截器实现的,需要配置分页插件,并且使用Page对象进行分页查询。引用中提到PageHelper和MyBatisPlus内置的分页插件,但需要注意两者可能有所不同,用户可能混淆了,需要明确说明MyBatisPlus自己的分页插件使用方法。 首先,用户需要引入MyBatisPlus的依赖,这可能包括在pom.xml中添加相关依赖,但用户提供的引用中并没有具体版本,可能需要我给出常用的依赖配置。不过引用[1]提到引入PageHelper,这可能是一个干扰项,因为PageHelper是另一个分页插件,而MyBatisPlus有自己的分页插件。需要明确区分,避免用户混淆。因此,在回答中应明确指出MyBatisPlus内置的分页插件,不需要PageHelper。 接下来,配置分页插件。根据引用[2],MyBatisPlus分页插件通过拦截器机制实现物理分页,需要在配置类中添加拦截器。这里需要给出具体的Java配置代码示例,比如使用@Configuration类,添加MybatisPlusInterceptor,并注册PaginationInnerInterceptor。 然后,实际使用分页查询。用户需要创建Page对象,调用selectPage方法,并处理结果。需要给出Service层或Mapper层的示例代码,比如在Service中调用baseMapper的selectPage方法,并返回Page对象。同时,需要说明Page对象包含的数据和分页信息,如总记录数、当前页等。 可能还需要提到自定义查询的分页处理,比如在XML中编写SQL不需要手动添加limit,因为插件会自动处理。这部分可以引用引用[2]中提到的物理分页机制。 最后,确保回答结构清晰,分步骤说明,并给出代码示例,同时引用正确的来源。需要检查是否有遗漏的步骤,比如依赖引入是否正确,配置是否完整,以及示例代码是否可运行。同时,用户可能遇到的问题,比如版本兼容性或配置错误,可能需要提及,但根据用户问题,可能不需要深入,保持回答简洁。 现在整理回答的结构:1. 引入依赖(正确MyBatisPlus依赖);2. 配置分页插件;3. 使用分页查询(示例代码);4. 自定义SQL分页处理。每个步骤配合代码示例和引用说明。</think>MyBatisPlus 分页查询的实现主要分为以下步骤,结合物理分页机制和拦截器技术实现高效分页: ### 一、配置分页插件 1. **添加依赖**(以 Maven 为例) ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.0</version> </dependency> ``` 2. **注册分页拦截器** 在 Spring Boot 配置类中添加: ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` 该拦截器会自动为 SQL 添加数据库方言的分页语句(如 MySQL 的 `LIMIT`)[^2]。 --- ### 二、分页查询使用示例 #### 基础用法(Service 层) ```java // 1. 创建分页参数(第2页,每页10条) Page<User> page = new Page<>(2, 10); // 2. 执行分页查询 Page<User> result = userService.page(page); // 3. 获取分页数据 List<User> records = result.getRecords(); // 当前页数据 long total = result.getTotal(); // 总记录数 ``` #### 条件分页查询(Mapper 层) ```java // 1. 构建查询条件 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.like(User::getName, "张"); // 2. 执行分页查询 Page<User> page = new Page<>(1, 5); userMapper.selectPage(page, wrapper); ``` --- ### 三、自定义 SQL 分页 在 XML 映射文件中无需手动写 `LIMIT`,插件会自动改写 SQL: ```xml <select id="selectUserByAge" resultType="User"> SELECT * FROM user WHERE age > #{age} </select> ``` Java 调用: ```java Page<User> page = new Page<>(1, 10); userMapper.selectUserByAge(page, 18); List<User> users = page.getRecords(); ``` --- ### 四、关键特性说明 1. **物理分页机制** 直接在数据库层面执行分页(如 MySQL 生成 `LIMIT 0,10`),避免内存溢出风险[^2]。 2. **性能优化** 自动检测数据库类型并适配方言,支持多种数据库(MySQL、Oracle、PostgreSQL 等)。 3. **智能 COUNT 查询** 若需要总记录数,插件会自动发起 `COUNT(*)` 查询;若已知总数可调用 `page.setSearchCount(false)` 跳过统计。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值