MyBatis-Plus 中的分页插件配置

学习文章:MyBatis-Plus 中的分页插件配置

    • [MyBatis-Plus 中的分页插件配置](#MyBatis-Plus 中的分页插件配置)
      • [1. 简介](#1. 简介)
      • [2. 分页插件配置](#2. 分页插件配置)
        • [2.1 配置类](#2.1 配置类)
        • [2.2 代码解释](#2.2 代码解释)
        • [2.3 作用](#2.3 作用)
      • [3. 分页插件的工作原理](#3. 分页插件的工作原理)
      • [4. 使用分页插件](#4. 使用分页插件)
        • [4.1 实体类 `User`](#4.1 实体类 User)
        • [4.2 Mapper 接口](#4.2 Mapper 接口)
        • [4.3 服务层调用分页查询](#4.3 服务层调用分页查询)
        • [4.4 控制器层处理分页请求](#4.4 控制器层处理分页请求)
        • [4.5 测试分页效果](#4.5 测试分页效果)
      • [5. 高级配置](#5. 高级配置)
        • [5.1 设置最大页数](#5.1 设置最大页数)
        • [5.2 分页插件的性能优化](#5.2 分页插件的性能优化)
      • [6. 总结](#6. 总结)

MyBatis-Plus 中的分页插件配置

1. 简介

MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它简化了 MyBatis 的开发,提供了许多常用功能的增强,包括分页功能。分页查询是数据库中最常见的需求之一,尤其在处理大量数据时,分页查询能够有效减少内存消耗和提升查询性能。

在 MyBatis-Plus 中,分页功能通过分页插件 PaginationInterceptor 来实现。该插件会自动拦截分页查询请求,在执行 SQL 时自动为查询语句添加分页条件,并且可以自动获取总记录数(total)。

本文将详细讲解如何配置 MyBatis-Plus 的分页插件,并介绍相关的使用方法。

2. 分页插件配置

在 Spring Boot 项目中,我们通常需要对分页插件进行简单的配置,以便启用分页查询功能。以下是一个常见的分页插件配置类:

2.1 配置类
java 复制代码
package com.example.demo.config;

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

@Configuration
public class MyBatisPlusConfig {

    /**
     * 配置 MyBatis-Plus 分页插件
     * 
     * @return PaginationInterceptor
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
2.2 代码解释
  • @Configuration 注解:表示这是一个 Spring 配置类,Spring 会扫描并加载该配置类。
  • @Bean 注解:用于将 PaginationInterceptor 实例注入 Spring 容器,使其成为一个 Spring 管理的 Bean。
  • PaginationInterceptor:是 MyBatis-Plus 提供的分页插件,它可以自动处理分页逻辑,包括计算总记录数、自动为 SQL 查询添加分页条件等。
2.3 作用
  • 拦截分页查询PaginationInterceptor 会自动拦截所有分页查询请求,在执行查询前,会向 SQL 语句中添加 LIMIT 子句(或者在支持的数据库中使用类似的分页语法)。
  • 自动处理总记录数 :它会自动计算符合条件的记录总数并设置到 Page 对象的 total 字段中,返回给前端进行分页显示。

3. 分页插件的工作原理

分页插件的工作原理相对简单:

  1. 分页查询请求 :用户请求分页查询时,传入一个 Page 对象作为参数,Page 对象封装了当前页码和每页的记录数。
  2. 拦截 SQL 语句PaginationInterceptor 会拦截执行的 SQL 语句,在 SQL 中自动加入 LIMIT 子句(或其他适合数据库的分页语法),实现数据库级的分页。
  3. 查询总记录数 :插件会根据分页条件执行一次 COUNT 查询,计算出符合条件的总记录数。
  4. 返回分页数据 :插件会返回分页数据和总记录数,设置到 Page 对象中,返回给调用方。

4. 使用分页插件

假设我们有一个 User 实体类,和对应的 Mapper 接口。以下是一个使用分页插件的典型例子。

4.1 实体类 User
java 复制代码
public class User {
    private Long id;
    private String username;
    private String email;
    private Integer age;
    // Getter 和 Setter 省略
}
4.2 Mapper 接口
java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

public interface UserMapper extends BaseMapper<User> {

    // 使用 MyBatis-Plus 的分页功能
    @Select("SELECT * FROM user WHERE age > #{age}")
    List<User> selectUsersByAge(Page<User> page, Integer age);
}
4.3 服务层调用分页查询
java 复制代码
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public Page<User> getUsersByAge(Integer age, Integer pageNum, Integer pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);  // 设置页码和每页大小
        List<User> users = userMapper.selectUsersByAge(page, age);  // 执行分页查询
        page.setRecords(users);  // 设置查询结果
        return page;
    }
}
4.4 控制器层处理分页请求
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public Page<User> getUsers(@RequestParam Integer age, 
                               @RequestParam Integer pageNum, 
                               @RequestParam Integer pageSize) {
        return userService.getUsersByAge(age, pageNum, pageSize);
    }
}
4.5 测试分页效果

假设你访问 /users?age=25&pageNum=1&pageSize=10,分页插件会自动计算符合条件的总记录数,并返回数据。

返回的 Page<User> 对象中,包含了:

  • records:当前页的数据记录。
  • total:符合条件的总记录数。

5. 高级配置

5.1 设置最大页数

为了避免用户请求过大的页码,可以通过配置 PaginationInterceptor 限制最大页数。

java 复制代码
@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    // 设置最大单页限制数量,默认 500 条,-1 不受限制
    paginationInterceptor.setLimit(500);
    return paginationInterceptor;
}
5.2 分页插件的性能优化
  • 分库分表支持 :MyBatis-Plus 提供了对分库分表的支持,PaginationInterceptor 会根据表的分片规则自动生成相应的分页查询语句,支持高性能分布式查询。
  • SQL 改写:分页插件会通过拦截 SQL,自动对查询语句进行改写,确保分页查询的高效执行。

6. 总结

MyBatis-Plus 的分页插件 PaginationInterceptor 是一个非常强大且易于配置的功能,能够帮助开发者轻松实现高效的分页查询。通过合理配置分页插件,开发者可以减少重复的分页代码,提高开发效率,并且确保分页查询的性能。

使用 MyBatis-Plus 的分页插件,我们只需简单配置,即可在 Spring Boot 项目中完成分页查询功能的实现,大大提升了开发效率和系统的性能。

相关推荐
鹿屿二向箔几秒前
【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统
spring·mvc·mybatis
司马相楠2 分钟前
嵌入式开发 的软件开发技能
开发语言·后端·golang
superCleanCoder4 分钟前
spring-boot启动源码分析(二)之SpringApplicationRunListener
java·spring boot
大卫小东(Sheldon)15 分钟前
在jooq的POJO类中使用Lombok的Data注解
java
java_t_t19 分钟前
安卓触摸事件的传递
android·java
fruge22 分钟前
【Cesium】九、Cesium点击地图获取点击位置的坐标,并在地图上添加图标
开发语言·javascript·ecmascript
BMG-Princess25 分钟前
SpringMVC
java·开发语言·前端
ac-er888826 分钟前
Go work stealing 机制
java·数据库·golang
小王不会写code26 分钟前
Spring MVC 的@GetMapping和@PostMapping和@PutMapping
java·spring·mvc
故里有青山38 分钟前
静态初始化块与非静态初始化块
java·开发语言