新闻详情

新闻详情

首页 / 资讯中心 / 详情

Springboot项目中MybatisPlus 分页、分页组件的查询使用完整示例

发布时间:2026/9/11 8:57:10来源:尧图网络
Springboot项目中MybatisPlus 分页、分页组件的查询使用完整示例
在 Spring Boot 项目中使用 MyBatis-Plus (MP) 进行分页查询核心在于分页插件的配置和**IPage**** /**Page**对象的使用**。以下是一份完整的、涵盖各种常见用法的实战示例演示。1. 基础配置必须MyBatis-Plus 的分页功能不是默认开启的必须手动注册拦截器。1.1 添加依赖dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactId!-- Boot2用 mybatis-plus-boot-starter --version3.5.7/version/dependency1.2 注册分页插件ConfigurationMapperScan(com.example.mapper)publicclassMybatisPlusConfig{/** * 新版 3.4.0 推荐写法 */BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();// ⚠️ 注意如果同时使用了多租户或乐观锁插件分页插件建议放在最后PaginationInnerInterceptorpaginationInterceptornewPaginationInnerInterceptor(DbType.MYSQL);// 设置最大单页限制数量默认 500 条-1 不受限制paginationInterceptor.setMaxLimit(500L);// 溢出处理页码超出总页数时是否跳到第一页paginationInterceptor.setOverflow(false);interceptor.addInnerInterceptor(paginationInterceptor);returninterceptor;}}2. 实体与 Mapper 准备DataTableName(sys_user)publicclassUser{TableId(typeIdType.AUTO)privateLongid;privateStringusername;privateIntegerage;privateStringemail;privateLocalDateTimecreateTime;}MapperpublicinterfaceUserMapperextendsBaseMapperUser{// 自定义分页方法XML或注解SQLIPageUserselectUserPage(IPageUserpage,Param(age)Integerage);}3. 各种分页用法示例✅ 用法一基础条件分页最常用使用 MP 内置的selectPageLambdaQueryWrapper。ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;publicIPageUsergetUserList(intpageNum,intpageSize,Stringusername){// 1. 构建分页参数PageUserpagenewPage(pageNum,pageSize);// 2. 构建查询条件LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.like(StrUtil.isNotBlank(username),User::getUsername,username).orderByDesc(User::getCreateTime);// 3. 执行分页查询returnuserMapper.selectPage(page,wrapper);}}✅ 用法二自定义 SQL 分页当复杂查询多表关联、统计字段无法用 Wrapper 表达时在 XML 中写 SQLMP 会自动拦截并追加LIMIT和COUNT。Mapper:IPageUserVoselectCustomPage(IPageUserVopage,Param(deptId)LongdeptId);XML:!-- ⚠️ 注意只需要写业务SQL不要手写 LIMITMP会自动处理 --selectidselectCustomPageresultTypecom.example.vo.UserVoSELECT u.id, u.username, d.dept_name, COUNT(o.id) as order_count FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id d.id LEFT JOIN sys_order o ON u.id o.user_id WHERE u.dept_id #{deptId} GROUP BY u.id, u.username, d.dept_name ORDER BY order_count DESC/select✅ 用法三返回 VO/DTO 的分页转换数据库查出来是 Entity但前端需要 VO。不要先查全部再手动转利用 MP 的convert方法。publicIPageUserVOgetUserVoPage(intpageNum,intpageSize){PageUserentityPagenewPage(pageNum,pageSize);LambdaQueryWrapperUserwrappernewLambdaQueryWrapperUser().eq(User::getAge,25);// 查出 Entity 分页结果IPageUseruserPageuserMapper.selectPage(entityPage,wrapper);// 一行代码转换为 VO 分页对象保留分页元数据IPageUserVOvoPageuserPage.convert(user-{UserVOvonewUserVO();BeanUtils.copyProperties(user,vo);vo.setDisplayName(user.getUsername()(user.getAge()));returnvo;});returnvoPage;}✅ 用法四Map 方式接收分页结果适用于动态列、报表等场景。publicIPageMapString,ObjectgetMapPage(intpageNum,intpageSize){PageMapString,ObjectpagenewPage(pageNum,pageSize);QueryWrapperUserwrappernewQueryWrapper();wrapper.select(id,username,age).gt(age,20);returnuserMapper.selectMapsPage(page,wrapper);}✅ 用法五仅查询列表 / 仅查询总数避免不必要的 COUNT 查询提升性能。// 只查列表不执行 SELECT COUNT(*)publicListUsergetListWithoutCount(intpageNum,intpageSize){PageUserpagenewPage(pageNum,pageSize,false);// 第三个参数设为 falsereturnuserMapper.selectPage(page,null).getRecords();}// 只查总数publiclonggetCount(){LambdaQueryWrapperUserwrappernewLambdaQueryWrapperUser().eq(User::getAge,25);returnuserMapper.selectCount(wrapper);}4. Controller 层统一响应封装RestControllerRequestMapping(/api/users)publicclassUserController{AutowiredprivateUserServiceuserService;GetMapping(/page)publicRIPageUserVOpage(RequestParam(defaultValue1)intpageNum,RequestParam(defaultValue10)intpageSize,RequestParam(requiredfalse)Stringusername){IPageUserVOresultuserService.getUserVoPage(pageNum,pageSize);returnR.ok(result);}}返回 JSON 结构示例{code:200,data:{records:[...],// 当前页数据列表total:156,// 总记录数size:10,// 每页大小current:1,// 当前页码pages:16,// 总页数searchCount:true// 是否进行了count查询}}5. ⚠️ 常见坑点与注意事项问题原因 解决方案分页不生效返回全部数据未注册MybatisPlusInterceptor或 DbType 设置错误自定义SQL分页报错XML 中手写了LIMIT导致 MP 拼接出双重 LIMIT去掉手写 LIMITCOUNT 查询很慢复杂关联查询的 COUNT 优化可在 XML 中单独写select idxxx_mpCount覆盖默认 COUNT 逻辑深分页性能差LIMIT 1000000, 10依然慢改用游标分页WHERE id lastId LIMIT 10或 ES多线程下 Page 对象复用Page对象非线程安全每次请求必须new Page()不要定义为成员变量overflow 配置当请求页码 总页数时overflowtrue回到首页false返回空列表6. IPage 核心属性速查IPageUserpageuserMapper.selectPage(newPage(1,10),null);page.getRecords();// 数据列表page.getTotal();// 总记录数page.getSize();// 每页条数page.getCurrent();// 当前页码page.getPages();// 总页数page.hasNext();// 是否有下一页page.hasPrevious();// 是否有上一页以上示例覆盖了 MyBatis-Plus 分页在日常开发中的绝大多数场景可直接复制到项目中使用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI生图工具商业选型指南:聚焦人效与工作流适配 2026/9/11 15:21:00

AI生图工具商业选型指南:聚焦人效与工作流适配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何给系统监控工具SystemInformer做自己的中文界面:三步完成 2026/9/11 15:21:00

如何给系统监控工具SystemInformer做自己的中文界面:三步完成

如何给系统监控工具SystemInformer做自己的中文界面:三步完成 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & S…

阅读更多 →
Nginx Proxy Manager 404 主机(Dead Host)实战指南:优雅处理已下线域名、SEO 降权与访问日志追踪 2026/9/11 15:21:00

Nginx Proxy Manager 404 主机(Dead Host)实战指南:优雅处理已下线域名、SEO 降权与访问日志追踪

Nginx Proxy Manager 404 主机(Dead Host)实战指南:优雅处理已下线域名、SEO 降权与访问日志追踪 【免费下载链接】nginx-proxy-manager Docker container for managing Nginx proxy hosts with a simple, powerful interface 项目地址: ht…

阅读更多 →
ArduPilot不写C也能加飞行逻辑?Lua脚本引擎上手实录 2026/9/11 15:21:00

ArduPilot不写C也能加飞行逻辑?Lua脚本引擎上手实录

ArduPilot不写C也能加飞行逻辑?Lua脚本引擎上手实录 【免费下载链接】ardupilot ArduPlane, ArduCopter, ArduRover, ArduSub source 项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot 你的飞机需要"到特定高度自动悬停拍照"&#xff…

阅读更多 →
SystemInformer 资源文件汉化:三步搞定中文界面 2026/9/11 15:21:00

SystemInformer 资源文件汉化:三步搞定中文界面

SystemInformer 资源文件汉化:三步搞定中文界面 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc…

阅读更多 →
STM32内存管理全解析:从RAM结构到优化实战 2026/9/11 15:17:59

STM32内存管理全解析:从RAM结构到优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞