Mybatis是如何进行分页的?与Mybatis-plus的区别在哪里?
MyBatis 的分页方式及其与 MyBatis-Plus 的区别可以总结如下:
MyBatis 的分页实现
-
逻辑分页(内存分页)
使用RowBounds
对象,在查询时传入参数,MyBatis 会在结果集返回后,在内存中手动截取指定范围的数据。
缺点:数据量大时性能差,需查询全部数据后再分页,浪费内存和网络资源。
示例:List<User> users = sqlSession.selectList("getUsers", null, new RowBounds(10, 5));
-
物理分页(SQL 分页)
- 手动拼接 SQL:在 SQL 中直接编写分页语法(如 MySQL 的
LIMIT offset, size
)。
缺点:需针对不同数据库适配 SQL,代码冗余。 - 使用插件(如 PageHelper):
通过拦截器自动修改 SQL,添加分页参数。
示例:PageHelper.startPage(2, 10); // 第2页,每页10条 List<User> users = userMapper.selectAll(); PageInfo<User> pageInfo = new PageInfo<>(users);
- 手动拼接 SQL:在 SQL 中直接编写分页语法(如 MySQL 的
MyBatis-Plus 的分页实现
- 内置物理分页插件
配置PaginationInterceptor
拦截器后,直接使用Page
对象和selectPage()
方法实现分页。
特点:- 自动生成分页 SQL(适配不同数据库)。
- 封装分页结果(含数据列表、总记录数、总页数等)。
示例:
Page<User> page = new Page<>(2, 10); // 第2页,每页10条 IPage<User> result = userMapper.selectPage(page, queryWrapper);
MyBatis 与 MyBatis-Plus 的分页区别
特性 | MyBatis | MyBatis-Plus |
---|---|---|
分页方式 | 需手动实现(逻辑分页或物理分页)。 | 内置物理分页,开箱即用。 |
SQL 处理 | 依赖插件(如 PageHelper)或手动拼接 SQL。 | 自动生成适配不同数据库的分页 SQL。 |
结果封装 | 需手动处理总记录数等分页信息。 | 自动封装分页结果到 Page 对象。 |
代码简洁性 | 需编写更多模板代码。 | 通过 API 简化操作,与 CRUD 深度集成。 |
多数据库支持 | 需自行处理不同数据库的分页语法差异。 | 内置多方言支持,自动适配。 |
总结
- MyBatis:灵活性高,但分页需依赖第三方插件或手动处理,代码较为繁琐。
- MyBatis-Plus:通过内置分页插件提供标准化、便捷的分页操作,适合快速开发,减少重复代码。