mybatispuls 分页插件的基本原理是什么?

MyBatis-Plus 是一个基于 MyBatis 的增强框架,它提供了许多额外的功能,其中分页插件是一个常用的功能。分页插件的基本原理是拦截 SQL 语句,在执行查询之前对 SQL 进行修改,以实现分页的功能。以下是 MyBatis-Plus 分页插件的基本原理及其工作机制:

1. 基本原理

分页插件的基本原理是拦截器(Interceptor)机制。MyBatis-Plus 使用拦截器来拦截执行的 SQL 语句,并在 SQL 语句执行之前或之后对其进行处理。分页插件会在 SQL 执行之前拦截查询语句,并根据分页参数修改原始 SQL 语句,以达到分页查询的效果。

2. 工作机制

  1. 拦截器注册:分页插件通过拦截器机制注册到 MyBatis 拦截器链中。
  2. SQL 拦截:当执行查询操作时,分页插件会拦截 SQL 语句。
  3. 分页参数解析:分页插件从请求参数或上下文中获取分页参数(如当前页码、每页记录数)。
  4. SQL 修改:根据分页参数对原始 SQL 语句进行修改,添加分页相关的 SQL 片段(如 LIMIT 子句)。
  5. 执行查询:执行修改后的 SQL 语句,从数据库获取分页后的结果。
  6. 封装结果:将查询结果封装成分页对象,返回给调用者。

3. 示例代码

以下是一个使用 MyBatis-Plus 分页插件的示例代码:

Maven 依赖

首先,在 pom.xml 中添加 MyBatis-Plus 的依赖:

复制代码

xml复制代码

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency>

分页插件配置

配置分页插件:

复制代码

java复制代码

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }

实体类

创建一个实体类:

复制代码

java复制代码

import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { @TableId private Long id; private String name; private Integer age; // getters and setters }

Mapper 接口

创建一个 Mapper 接口:

复制代码

java复制代码

import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { }

服务类

在服务类中使用分页查询:

复制代码

java复制代码

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public IPage<User> getUserPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); return userMapper.selectPage(page, queryWrapper); } }

控制器

在控制器中调用分页查询方法:

复制代码

java复制代码

import com.baomidou.mybatisplus.core.metadata.IPage; 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; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public IPage<User> getUsers(@RequestParam int pageNum, @RequestParam int pageSize) { return userService.getUserPage(pageNum, pageSize); } }

4. 详细工作流程

  1. 拦截器注册 :当 Spring Boot 应用启动时,MyBatisPlusConfig 中的 PaginationInterceptor Bean 会被注册到 Spring 容器中。MyBatis-Plus 将这个拦截器添加到 MyBatis 的拦截器链中,以便在执行 SQL 语句时进行拦截处理。

  2. SQL 拦截 :当执行查询操作(如 userMapper.selectPage(page, queryWrapper))时,MyBatis-Plus 的分页拦截器会拦截该 SQL 语句。分页拦截器会识别出这是一个需要分页的查询,并截获这些查询请求。

  3. 分页参数解析 :分页拦截器会从 Page 对象中获取分页参数,如当前页码(pageNum)和每页记录数(pageSize)。

  4. SQL 修改 :根据分页参数,分页拦截器会对原始 SQL 语句进行修改。具体来说,如果数据库类型是 MySQL,分页拦截器会在原始 SQL 语句末尾添加 LIMIT 子句,以限制返回的记录数。例如,原始 SQL 语句 SELECT * FROM user 会被修改为 SELECT * FROM user LIMIT ?, ?,其中 ? 是参数占位符。

  5. 执行查询:MyBatis-Plus 会使用修改后的 SQL 语句进行查询,并将分页参数(如起始行号和记录数)传递给数据库执行。

  6. 封装结果 :查询结果返回后,MyBatis-Plus 会将结果集封装到 Page 对象中,并设置总记录数、总页数等分页信息。分页查询的最终结果将被封装成一个实现了 IPage 接口的对象,并返回给调用者。

总结

MyBatis-Plus 分页插件通过拦截器机制实现分页查询,其基本原理如下:

  1. 拦截器注册:将分页拦截器注册到 MyBatis 拦截器链中。
  2. SQL 拦截:在 SQL 执行之前拦截查询语句。
  3. 分页参数解析:从请求参数或上下文中获取分页参数。
  4. SQL 修改:修改原始 SQL 语句,添加分页相关的 SQL 片段。
  5. 执行查询:执行修改后的 SQL 语句,获取分页结果。
  6. 封装结果:将查询结果封装成分页对象,返回给调用者。

通过这一机制,MyBatis-Plus 分页插件能够高效地实现分页查询,简化了开发者的分页处理工作。

相关推荐
步行cgn1 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
霸道流氓气质3 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3763 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
步行cgn4 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
学到老活到老5 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
Flynn Liang5 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
二哈赛车手7 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu7 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
软件技术NINI14 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
一枕槐安4871 天前
RAG 服务扛住高并发:缓存、队列、限流三件套
java·spring·缓存·异步任务·rag·断路器