在mybatis-plus中实现分页功能

本文介绍了如何在Spring Boot项目中利用MyBatisPlus实现分页功能,包括基于Interceptor的默认分页配置和自定义分页查询。通过在mybatisConfig配置类中添加PaginationInnerInterceptor,并在Mapper接口中使用selectPage方法实现基础分页。同时,展示了如何自定义分页查询方法,通过在Mapper接口定义新的方法并在XML文件中配置SQL,完成自定义分页需求。

首先我们的分页是基于Interceptor的

所以我们的就得在我们的interceptor加上我们的PaginationInnerInterceptor对象:
代码实现:

@MapperScan("com.atguigu.mybatisplus.mapper")
@Configuration
public class mybatisConfig {

    @Bean
    public MybatisPlusInterceptor MPI(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;

    }

}

②、我们实现分页功能。使用的是继承于BaseMapper接口的UserMapper接口的selectPage方法。调用该方法我们必须传入两个参数:
1、第一个是Ipage接口的实现类。根据继承关系我们可以知道:
在这里插入图片描述

其Page就是一个Ipage实现类.

2、第二个参数就是包装类Wrapper,可以传入null
代码实现:

@Autowired
    UserMapper userMapper;

    @DisplayName("pageTest")
    @Test
    public void test01(){
        Page<User> page = new Page<>(1,3);
//新建一个Page对象,泛型为我们操作的类。User1表示的是当前页码,3则是pageSize 
        Page<User> userPage1 = userMapper.selectPage(page, null);
  System.out.println("当前页:"+page.getCurrent());
  System.out.println("每页显示的条数:"+page.getSize());
  System.out.println("总记录数:"+page.getTotal());
  System.out.println("总页数:"+page.getPages());
  System.out.println("是否有上一页:"+page.hasPrevious());
  System.out.println("是否有下一页:"+page.hasNext());


//        System.out.println(userPage1);

    }

二、自定义分页功能:
首先我们需要在我们的UserMapper中定义我们的我们抽象方法,
该方法返回Page对象:


Page<User> definePageVo(@Param("page") Page<User> page,@Param("age") int age))

然后在我们userMapper.xml中配置我们自定义的的方法:

<select id="selectPageVo" resultType="com.atguigu.mybatisplus.bean.User">
    SELECT id,name,age,email from user where age >#{age}
</select>

测试:

@Test
    public void test02(){

//        注入我们的参数
        Page<User> userPage = new Page<>(2, 3);
        userMapper.selectPageVo(userPage, 23);

//       获取结果:

        System.out.println(userPage.getCurrent());


    }

即可
### 分页查询的基本原理 MyBatis-Plus 通过分页拦截器 `PaginationInnerInterceptor` 实现分页查询功能。该拦截器会在执行查询操作前判断参数是否包含 `IPage` 类型的分页参数。如果包含,则根据分页信息动态生成分页查询 SQL,从而实现高效的分页查询功能[^2]。 ### 分页查询的实现方法 #### 1. 配置分页插件 在使用 MyBatis-Plus分页功能前,需要在配置类中注册 `PaginationInnerInterceptor` 插件: ```java @Configuration @MapperScan("com.example.mapper") public class MyBatisPlusConfig { @Bean public MyBatisPlusInterceptor myBatisPlusInterceptor() { MyBatisPlusInterceptor interceptor = new MyBatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` #### 2. 使用 `IPage` 进行分页查询 MyBatis-Plus 提供了多个分页查询方法,其中最常用的是 `page(IPage<T> page)` 和 `page(IPage<T> page, Wrapper<T> queryWrapper)`。以下是一个无条件分页查询的示例: ```java Page<User> page = new Page<>(1, 5); // 查询第一页,每页5条数据 Page<User> userPage = userMapper.page(page); List<User> users = userPage.getRecords(); ``` 若需添加查询条件,可以结合 `QueryWrapper` 使用: ```java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 18); // 查询年龄大于等于18岁的用户 Page<User> userPage = userMapper.page(new Page<>(1, 5), queryWrapper); List<User> users = userPage.getRecords(); ``` #### 3. 查询指定字段的分页结果 当希望分页查询结果只返回特定字段时,可以使用 `pageMaps` 方法,返回类型为 `Map<String, Object>`: ```java Page<Map<String, Object>> page = new Page<>(1, 5); Page<Map<String, Object>> pageParam = userMapper.pageMaps(page, null); List<Map<String, Object>> records = pageParam.getRecords(); records.forEach(System.out::println); ``` #### 4. 分页结果的处理 分页查询的结果封装在 `IPage` 对象中,可以通过该对象获取当前页码、总页数、每页记录数、总记录数等信息: ```java System.out.println("当前页:" + pageParam.getCurrent()); System.out.println("总页数:" + pageParam.getPages()); System.out.println("每页记录数:" + pageParam.getSize()); System.out.println("总记录数:" + pageParam.getTotal()); System.out.println("是否有下一页:" + pageParam.hasNext()); System.out.println("是否有上一页:" + pageParam.hasPrevious()); ``` ### 总结 MyBatis-Plus 提供了灵活且高效的分页查询机制,开发者只需配置 `PaginationInnerInterceptor` 插件,并使用 `IPage` 接口结合 `page` 方法即可实现分页功能。此外,结合 `QueryWrapper` 可以实现带条件的分页查询,而 `pageMaps` 方法则适用于仅查询部分字段的场景[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值