目录
MyBatis-Plus 分页查询概述
MyBatis-Plus 的分页功能是通过拦截 MyBatis 的查询操作,动态地修改 SQL 语句来实现的。它支持多种数据库的分页查询,包括 MySQL、PostgreSQL、SQL Server 和 Oracle 等。
核心概念
Page:分页参数和分页结果的载体。它包括当前页码、每页记录数、总记录数、总页数和当前页的数据列表等属性。
IPage:分页查询结果的接口,继承自
java.util.List
接口。PageInfo:封装了 Page 对象的额外信息,如每个页面的导航信息等。
QueryWrapper:用于构建查询条件的包装器,支持链式调用和 lambda 表达式。
OrderItem:用于定义排序规则的类。
分页查询的实现步骤
定义 Mapper 接口:
Mapper 接口应该继承
BaseMapper<T>
或IService<T>
,其中T
是你的实体类。@Mapper public interface UserMapper extends BaseMapper<User> { // 可以添加自定义方法 }
配置 MyBatis-Plus:
在配置类或配置文件中配置 MyBatis-Plus,包括 Mapper 扫描路径、类型别名包等。
# application.properties mybatis-plus.mapper-locations=classpath*:/mapper/*.xml mybatis-plus.type-aliases-package=com.example.demo.entity
创建 Page 对象:
在需要进行分页查询的地方创建一个 Page 对象,并设置当前页码、每页记录数等参数。
Page<User> page = new Page<>(1, 10);
编写 QueryWrapper:
使用 QueryWrapper 构建查询条件,支持链式调用和 lambda 表达式。
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 1);
调用分页查询方法:
在 Mapper 接口中调用分页查询方法,如
selectPage
。将 Page 对象和 QueryWrapper 作为参数传入。IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
处理分页结果:
从返回的 IPage 对象中获取总记录数、总页数和当前页的数据列表等信息。
long totalRecords = userPage.getTotal(); long totalPage = userPage.getPages(); List<User> users = userPage.getRecords();
排序:
在创建 Page 对象时,可以设置排序规则。MyBatis-Plus 会自动将排序规则应用到查询中。
List<OrderItem> orders = new ArrayList<>(); orders.add(new OrderItem("age", SortOrder.ASC)); orders.add(new OrderItem("create_time", SortOrder.DESC)); Page<User> page = new Page<>(1, 10, orders);
自定义分页逻辑:
如果需要自定义分页逻辑,可以重写
BaseMapper<T>
中的selectPage
方法。这样,你就可以根据实际需求调整分页查询的 SQL 语句。使用 PageInfo:
PageInfo 封装了 Page 对象的额外信息,如每个页面的导航信息。在 Service 层或 Controller 层返回 PageInfo 对象,可以方便地展示分页导航。
PageInfo<User> pageInfo = new PageInfo<>(userPage.getRecords()); return pageInfo;
注意事项
性能优化:确保在 WHERE 子句中使用的字段上有索引,以提高查询性能。
数据库兼容性:MyBatis-Plus 支持多种数据库的分页查询,但不同数据库的分页语句可能有所不同。确保你了解所使用的数据库的分页机制。
参数验证:在实际应用中,应该对传入的分页参数进行验证,避免出现负数或不合理的参数。
分页参数动态设置:分页参数(如当前页码和每页记录数)应该根据前端请求进行动态设置,而不是硬编码在代码中。
自定义拦截器:如果需要对分页查询进行更细粒度的控制,可以考虑使用 MyBatis 的拦截器(Interceptor)机制。