SpringBoot 整合 MyBatis-Plus 分页插件完整教程

SpringBoot 整合 MyBatis-Plus 分页插件完整教程
SpringBoot 整合 MyBatis-Plus 分页插件完整教程一、前置说明MP 分页必须手动注册分页拦截器不配置会出现分页 total 总条数为 0、不分页的问题适配 MP 3.5 新版写法MybatisPlusInterceptor 统一插件入口废弃旧版 PaginationInterceptor支持 MySQL、Oracle 等多种数据库可指定数据库类型优化分页 SQL。二、第一步编写分页配置类新建配置包com.config创建MyBatisPlusConfig.javajava运行package com.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class MyBatisPlusConfig { /** * 注册MyBatis-Plus统一拦截器 */ Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件 PaginationInnerInterceptor pageInterceptor new PaginationInnerInterceptor(); // 可选设置数据库类型自动适配分页语法MySQL可不写 // pageInterceptor.setDbType(DbType.MYSQL); // 可选设置单页最大条数防止恶意超大分页查询 pageInterceptor.setMaxLimit(1000L); interceptor.addInnerInterceptor(pageInterceptor); return interceptor; } }参数说明setMaxLimit(1000L)限制单次查询最多 1000 条避免LIMIT 1,100000深度分页拖垮数据库DbType.MYSQL数据库类型MP 自动生成分页语句多数据源场景建议显式指定。三、分页使用方式Service 层标准用法1. 分页对象构造PageT两个参数当前页码、每页条数java运行// 第1页每页10条 PageOrderInfo page new Page(1, 10);2. 配合 LambdaQueryWrapper 条件分页java运行Autowired private OrderInfoService orderInfoService; public PageOrderInfo getOrderPage(Integer pageNum, Integer pageSize) { // 1. 分页对象 PageOrderInfo page new Page(pageNum, pageSize); // 2. 查询条件 LambdaQueryWrapperOrderInfo wrapper new LambdaQueryWrapper(); wrapper.eq(OrderInfo::getIsDelete, 0) .orderByDesc(OrderInfo::getCreateTime); // 3. 执行分页查询 PageOrderInfo pageResult orderInfoService.page(page, wrapper); return pageResult; }3. 返回分页对象常用属性java运行// 当前页数据列表 ListOrderInfo records pageResult.getRecords(); // 总数据条数 long total pageResult.getTotal(); // 总页数 long pages pageResult.getPages(); // 当前页码 long current pageResult.getCurrent(); // 每页条数 long size pageResult.getSize();四、Mapper 层直接分页不推荐优先 Servicejava运行PageOrderInfo page new Page(1,10); LambdaQueryWrapperOrderInfo wrapper new LambdaQueryWrapper(); PageOrderInfo pageResult orderInfoMapper.selectPage(page, wrapper);五、自定义 XML 多表联查分页原生 SQL 分页兼容1. Mapper 接口java运行PageOrderVO selectOrderPage(PageOrderVO page, Param(name) String name);2. XML 不需要手写 LIMITMP 自动拼接分页语句xmlselect idselectOrderPage resultTypecom.vo.OrderVO SELECT o.*, p.product_name FROM order_info o LEFT JOIN product p ON o.product_id p.id where if testname ! null and name ! p.product_name LIKE CONCAT(%,#{name},%) /if o.is_delete 0 /where ORDER BY o.create_time DESC /select六、常见问题与解决方案问题 1分页查询 total 总条数为 0原因未配置MybatisPlusInterceptor分页插件 解决复制上方配置类确保被 Spring 扫描到加Configuration。问题 2深度分页 LIMIT 100000,10 很慢优化配置setMaxLimit限制最大单页条数大分页使用主键偏移分页替代普通分页。问题 3XML 自定义 SQL 分页失效方法第一个参数必须是PageT不要自己手写limit会重复拼接导致语法报错。问题 4分页插件与乐观锁 / 防全表更新插件共存直接叠加添加内部拦截器即可java运行interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());七、Controller 接收分页参数标准示例java运行GetMapping(/order/page) public ResultPageOrderInfo orderPage( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize ) { PageOrderInfo pageData orderInfoService.getOrderPage(pageNum, pageSize); return Result.success(pageData); }