系列博客目录
众多插件
MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有:
- PaginationInnerInterceptor:自动分页
- TenantLineInnerInterceptor:多租户
- DynamicTableNameInnerInterceptor:动态表名
- OptimisticLockerInnerInterceptor:乐观锁
- IllegalSQLInnerInterceptor:sql 性能规范
- BlockAttackInnerInterceptor:防止全表更新与删除
注意:
使用多个插件的时候需要注意插件定义顺序,建议使用顺序如下:
- 多租户,动态表名
- 分页,乐观锁
- sql 性能规范,防止全表更新与删除
这里我们以分页插件为里来学习插件的用法,最常用。MP没有限制分页的方式的,也可以使用之前的PageHelper来实现,不过需要额外引入PageHelper的依赖,既然我们已经用来MP的依赖,我们为了方便可以直接使用MP的分页。
分页插件
在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IService和BaseMapper中的分页方法都无法正常起效。所以,我们必须配置分页插件。
首先,要在配置类中注册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"

最低0.47元/天 解锁文章
1117

被折叠的 条评论
为什么被折叠?



