详细介绍下mybatis plus 分页查询
时间: 2025-04-13 07:57:07 浏览: 30
<think>嗯,用户之前让我介绍了包括MyBatis-Plus在内的多个技术,现在他们特别想深入了解MyBatis-Plus的分页查询功能。我需要仔细回想之前的回答,确保现在的内容不重复但更深入。
首先,用户可能已经知道MyBatis-Plus是MyBatis的增强工具,所以不需要再重复基本概念。他们需要的是分页查询的具体使用方法、配置步骤以及实际案例。可能他们正在项目中遇到分页需求,或者想优化现有的分页实现。
接下来,我得考虑用户的使用场景。可能是开发一个需要分页展示数据的后台管理系统,比如用户列表、订单记录等。这时候,分页查询的性能和易用性非常重要。用户可能关心如何快速集成,是否需要编写大量SQL,以及如何避免性能问题,比如内存溢出。
用户的身份可能是Java后端开发人员,对Spring Boot和MyBatis有一定了解,但可能对MyBatis-Plus的高级功能不熟悉。他们需要明确的步骤和代码示例,以便快速应用到项目中。同时,他们可能也关心分页插件的工作原理,比如是否使用了物理分页,以及如何防止SQL注入等安全问题。
此外,用户可能没有明说的深层需求包括分页查询的优化,比如缓存机制、多表联查时的分页处理,或者在分布式系统中分页的一致性。不过,根据当前的问题,可能主要集中在基础实现和配置上,所以需要先覆盖这些内容,再适当提及高级用法。
需要确保回答结构清晰,分步骤说明配置、基本使用、进阶功能,并提供示例代码。还要注意使用中文,避免技术术语的混淆,同时保持代码的正确性和规范性。最后,综合案例部分可以加强用户的理解,展示如何在实际项目中应用这些知识。</think>以下是 MyBatis-Plus 分页查询的详细说明,分模块解析其实现原理、使用步骤和实际案例:
---
### 一、分页查询原理
MyBatis-Plus 的分页查询基于 **物理分页**(直接通过 SQL 的 `LIMIT` 语句实现),而非内存分页。
**核心流程**:
1. 创建分页参数对象(页码、每页条数)
2. 自动在 SQL 末尾追加 `LIMIT offset, size`
3. 执行查询并封装分页结果(包含总记录数、当前页数据)
---
### 二、基础配置(Spring Boot 集成)
#### 1. 添加分页插件
在配置类中注入 `PaginationInterceptor`(旧版本)或 `MybatisPlusInterceptor`(新版本):
```java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
```
#### 2. 配置分页参数(可选)
通过 `Page` 对象指定分页参数:
```java
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
```
---
### 三、基础使用方式
#### 1. Service 层分页查询
直接调用 `page` 方法:
```java
// 查询所有用户(无条件)
Page<User> userPage = userService.page(page);
// 带条件查询(使用 QueryWrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "张");
Page<User> userPage = userService.page(page, wrapper);
```
#### 2. Mapper 层自定义 SQL 分页
Mapper 接口定义:
```java
@Select("SELECT * FROM user WHERE age > #{age}")
Page<User> selectByAge(Page<User> page, @Param("age") Integer age);
```
---
### 四、进阶功能
#### 1. 不查询总记录数(提升性能)
```java
Page<User> page = new Page<>(1, 10).setSearchCount(false);
```
#### 2. 多表联查分页
在 XML 中编写 SQL,注意 `LIMIT` 必须放在最后:
```xml
<select id="selectUserWithRole" resultType="UserVO">
SELECT u.*, r.role_name
FROM user u
LEFT JOIN role r ON u.role_id = r.id
${ew.customSqlSegment} <!-- 自动拼接 WHERE 条件 -->
</select>
```
---
### 五、实际案例:订单分页查询
#### 场景需求
- 按订单状态筛选
- 按时间倒序排序
- 每页显示 15 条
#### 实现代码
```java
// 1. 创建分页对象
Page<Order> page = new Page<>(currentPage, 15);
// 2. 构建查询条件
LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery();
wrapper.eq(Order::getStatus, 1) // 状态为已支付
.orderByDesc(Order::getCreateTime);
// 3. 执行分页查询
Page<Order> result = orderService.page(page, wrapper);
// 4. 获取结果
List<Order> records = result.getRecords(); // 当前页数据
long total = result.getTotal(); // 总记录数
```
---
### 六、注意事项
1. **数据库类型**:需正确配置 `DbType`(如 `DbType.MYSQL`)
2. **性能优化**:大数据量时建议关闭 `count` 查询
3. **SQL 注入防护**:避免直接拼接用户输入参数
4. **排序字段**:推荐使用数据库字段名而非 Java 属性名
---
通过 MyBatis-Plus 的分页机制,开发者可以快速实现高性能分页功能,减少模板代码量,典型应用于后台管理系统中的表格数据展示场景。
阅读全文
相关推荐







