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 项目中完成分页查询功能的实现,大大提升了开发效率和系统的性能。

相关推荐
dadaobusi2 小时前
学习:RV lkvm SBI
java·学习·spring
djarmy4 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO94 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧4 小时前
Java:no content to map due to end of input
java·开发语言
阿维的博客日记4 小时前
Example 类全场景实战指南
java·mybatis
梦梦代码精4 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
两点王爷4 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
隔窗听雨眠4 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫5 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141915 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt