黑马微服务开发与实战学习笔记_MybatisPlus_P4 插件功能

系列博客目录



众多插件

MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有:

  • PaginationInnerInterceptor:自动分页
  • TenantLineInnerInterceptor:多租户
  • DynamicTableNameInnerInterceptor:动态表名
  • OptimisticLockerInnerInterceptor:乐观锁
  • IllegalSQLInnerInterceptor:sql 性能规范
  • BlockAttackInnerInterceptor:防止全表更新与删除

注意:

使用多个插件的时候需要注意插件定义顺序,建议使用顺序如下:

  • 多租户,动态表名
  • 分页,乐观锁
  • sql 性能规范,防止全表更新与删除

这里我们以分页插件为里来学习插件的用法,最常用。MP没有限制分页的方式的,也可以使用之前的PageHelper来实现,不过需要额外引入PageHelper的依赖,既然我们已经用来MP的依赖,我们为了方便可以直接使用MP的分页。

分页插件

在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IServiceBaseMapper中的分页方法都无法正常起效。所以,我们必须配置分页插件。

首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件。
在项目中新建一个配置类:
在这里插入图片描述

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.annotation.DbType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisConfig {
   
   

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
   
   
        // 1. 初始化核心插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 2. new分页插件 DbType.MYSQL 表示 使用的是 MySQL 数据库
        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        
        // 设置分页查询的最大限制
        pageInterceptor.setMaxLimit(1000L);  // 设置分页上限为 1000
        
        // 将分页插件添加到拦截器中,也可以添加其他MP插件
        interceptor.addInnerInterceptor(pageInterceptor);
        
        return interceptor;
    }
}

IService中的分页代码
第一个函数的第二个参数就是Wrapper查询条件,第一个参数page有个泛型E,E就是前面定义好的E extends IPage,就是IPage这个接口以及其子类类型(如下图所示)。
在这里插入图片描述
用的最多的就是Page,Page里面包含分页的参数,页码,每页的大小,排序方式等信息。
所以调用分页函数的时候,首先传分页的参数,再传查询条件。
函数的返回值也是E,其实和PageHelper一样,传的参数不光是参数还有分页结果,只不过传的时候没有结果而已,填好之后再返回带有结果的E。

/**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
   
   
        return getBaseMapper().selectPage(page, queryWrapper);
    }

    /**
     * 无条件翻页查询
     *
     * @param page 翻页对象
     * @see Wrappers#emptyWrapper()
     */
    default <E extends IPage<T>> E page(E page) {
   
   
        return page(page, Wrappers.emptyWrapper());
    }

现在可以使用了

@Test
void testPageQuery() {
   
   
    // 1. 设置分页参数
    int pageNo = 1;    // 当前页码
    int pageSize = 2;  // 每页显示的记录数

    // 1.1 创建分页对象,使用 Page.of 方法来指定当前页和每页记录数
    Page<User> page = Page.of(pageNo, pageSize);

    // 1.2 设置排序条件,通过 OrderItem 来指定排序字段和排序方式
    page.addOrder(new OrderItem("balance", false));  // 根据 balance 字段降序排序

    // 1.3 执行分页查询,获取分页数据
    Page<User> p = userService.page(page);

    // 2. 打印总记录数
    System.out.println("Total records: " + p.getTotal());  // 获取查询的总记录数

    // 3. 打印总页数
    System.out.println("Total pages: " + p.getPages());  // 获取总页数

    // 4. 获取当前页的数据
    List<User> records = p.getRecords();  // 获取当前页的记录

    // 5. 遍历并打印当前页的数据
    records.forEach(System.out::println);
}

在这里插入图片描述

案例

简单分页查询案例。需求:遵循下面的接口规范,编写一个UserController接口,实现User的分页查询

请求方式

  • GET

请求路径

  • /users/page

请求参数

{
   
   
    "pageNo": 1,      // 当前页码,表示从第几页开始查询
    "pageSize": 5,    // 每页显示的记录数
    "sortBy": "balance",  // 排序字段,表示根据哪个字段进行排序
    "isAsc": false,   // 排序方式,true 表示升序,false 表示降序
    "name": "o",      // 用户名筛选条件,支持模糊查询
    "status": 1       // 用户状态筛选条件,1 表示正常状态
}

返回值

{
   
   
    "total": 100006,  // 总记录数
    "pages"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值