Mybatis数据分页的多种实现方式详解

📅 2026/7/31 19:02:58
Mybatis数据分页的多种实现方式详解
MyBatis 实现数据分页主要有以下几种方式1.SQL 分页手动分页在 SQL 语句中直接使用数据库特定的分页语法如 MySQL 的LIMIT和OFFSETOracle 的ROWNUM等。示例MySQLSELECT*FROMusersLIMIT#{offset}, #{pageSize};优点简单直接无需额外依赖。缺点需手动计算偏移量SQL 与数据库强绑定移植性差。2.RowBounds 分页逻辑分页MyBatis 内置的RowBounds类可在 Java 代码中指定分页参数RowBoundsrowBoundsnewRowBounds(offset,pageSize);ListUseruserssqlSession.selectList(UserMapper.selectAll,null,rowBounds);优点代码简洁无需修改 SQL。缺点先查询全量数据再内存分页大数据量时性能差。3.分页插件物理分页通过拦截器在 SQL 执行前动态添加分页逻辑如PageHelper主流方案。PageHelper 使用步骤添加依赖MavendependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper-spring-boot-starter/artifactIdversion最新版本/version/dependency配置插件自动配置或手动ConfigurationpublicclassMyBatisConfig{BeanpublicPageInterceptorpageInterceptor(){returnnewPageInterceptor();}}业务代码中使用// 开启分页后续查询会自动添加分页逻辑PageHelper.startPage(pageNum,pageSize);ListUserusersuserMapper.selectAll();// 获取分页信息PageInfoUserpageInfonewPageInfo(users);优点透明化分页逻辑支持多种数据库性能优。缺点需引入依赖可能有版本兼容问题。4.自定义拦截器通过实现Interceptor接口自定义分页逻辑适用于复杂场景Intercepts({Signature(typeExecutor.class,methodquery,args{MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})publicclassCustomPageInterceptorimplementsInterceptor{OverridepublicObjectintercept(Invocationinvocation)throwsThrowable{// 动态修改 SQL添加分页逻辑// ...returninvocation.proceed();}}5.流式查询大数据量分页使用 MyBatis 的CursorT接口逐行处理数据避免一次性加载全量数据try(CursorUsercursoruserMapper.selectByCursor()){for(Useruser:cursor){// 处理数据}}分页方案选择建议小数据量SQL 分页或 RowBounds。大数据量分页插件如 PageHelper或自定义拦截器。复杂场景自定义拦截器或流式查询。注意事项物理分页性能优于逻辑分页。分页插件可能影响复杂 SQL 的执行需谨慎使用。不同数据库的分页语法不同切换数据库时需注意兼容性。