网站首页 > 技术文章 正文
一句话总结
MyBatis实现分页主要有三种方式:1. 使用RowBounds对象进行内存分页(适用于小数据量);2. 在SQL中直接编写LIMIT/OFFSET语句(如MySQL);3. 通过分页插件(如PageHelper)自动拦截SQL并添加分页逻辑。物理分页推荐使用插件或数据库方言实现,避免内存溢出风险。
详细解析
在 MyBatis 中实现分页查询,主要有以下几种方式,各有优缺点和适用场景:
1. 原生 MyBatis 分页(手动参数传递)
通过 SQL 的LIMIT和OFFSET(或数据库方言如 Oracle 的ROWNUM)手动分页。
实现步骤:
1.1、实体类定义:
public class PageParam {
private int pageNum; // 当前页码
private int pageSize; // 每页数量
// Getters & Setters
}
1.2、Mapper XML:
<select id="selectUsersByPage" resultType="User">
SELECT * FROM user
LIMIT #{pageSize} OFFSET #{offset}
</select>
1.3、Mapper 接口:
public interface UserMapper {
List<User> selectUsersByPage(@Param("pageSize") int pageSize, @Param("offset") int offset);
}
1.4、调用代码:
int pageNum = 2; // 第2页
int pageSize = 10;
int offset = (pageNum - 1) * pageSize; // 计算偏移量
List<User> users = userMapper.selectUsersByPage(pageSize, offset);
特点:
优点:简单直接,无需第三方依赖。
缺点:需手动计算偏移量,不同数据库需调整 SQL 方言(如 Oracle 用ROWNUM)
2. 使用RowBounds(逻辑分页)
通过 MyBatis 内置的RowBounds对象实现逻辑分页(内存分页)。
实现步骤:
2.1 Mapper 接口:
List<User> selectAllUsers(RowBounds rowBounds);
2.2 XML SQL:
<select id="selectAllUsers" resultType="User">
SELECT * FROM user
</select>
2.3 调用代码:
int pageNum = 2;
int pageSize = 10;
RowBounds rowBounds = new RowBounds((pageNum - 1) * pageSize, pageSize);
List<User> users = userMapper.selectAllUsers(rowBounds);
特点:
优点:代码简单,统一分页方式。
缺点:本质是内存分页(先查询全部数据,再截取片段),大数据量时性能差。
3. 使用分页插件(推荐:PageHelper)
通过第三方插件(如 PageHelper)实现物理分页,自动改写 SQL。
实现步骤:
3.1 添加依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.2</version>
</dependency>
3.2 配置拦截器(在mybatis-config.xml中):
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/> <!-- 指定数据库方言 -->
</plugin>
</plugins>
3.3 Mapper XML:
<select id="selectAllUsers" resultType="User">
SELECT * FROM user
</select>
3.4 调用代码:
int pageNum = 2;
int pageSize = 10;
PageHelper.startPage(pageNum, pageSize); // 开启分页
List<User> users = userMapper.selectAllUsers();
PageInfo<User> pageInfo = new PageInfo<>(users);
结果说明:
PageInfo对象包含分页信息
pageInfo.getTotal(); // 总记录数
pageInfo.getPages(); // 总页数
pageInfo.getPageNum(); // 当前页码
pageInfo.getList(); // 当前页数据
特点:
优点:自动生成分页 SQL,支持多种数据库,性能高。
缺点:需引入第三方库。
4. MyBatis-Plus 分页(集成方案)
若项目使用 MyBatis-Plus,可直接使用其内置分页插件。
实现步骤:
4.1 添加依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
4.2 配置分页:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
4.2 Mapper 接口:
public interface UserMapper extends BaseMapper<User> {
// 无需定义分页方法
}
4.3 调用代码:
int pageNum = 2;
int pageSize = 10;
Page<User> page = new Page<>(pageNum, pageSize);
IPage<User> userPage = userMapper.selectPage(page, null);
List<User> users = userPage.getRecords();
long total = userPage.getTotal();
特点:
优点:与 MyBatis-Plus 深度集成,支持 Lambda 表达式。
缺点:需引入 MyBatis-Plus 依赖。
猜你喜欢
- 2025-07-17 PageHelper - 最方便的 MyBatis 分页插件
- 2025-07-17 面试二:pagehelper是怎么实现分页的,
- 2025-07-17 SpringBoot 各种分页查询方式详解(全网最全)
- 2024-10-24 SpringBoot源码:pageHelper分页,值得你看
- 2024-10-24 mysql和oracle的区别有哪些 mysql和oracle关系
- 2024-10-24 java必背综合知识点总结(数据库篇)
- 2024-10-24 如果让你写一个MyBatis分页插件,你打算怎么实现?
- 2024-10-24 PageHelper分页插件源码及原理剖析
- 2024-10-24 mysql和oracle的区别有什么 oracle 和mysql的区别
- 2024-10-24 阿里巴巴oracle面试总结 阿里巴巴面试题及答案 java
你 发表评论:
欢迎- 612℃几个Oracle空值处理函数 oracle处理null值的函数
- 603℃Oracle分析函数之Lag和Lead()使用
- 592℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 589℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 583℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 576℃【数据统计分析】详解Oracle分组函数之CUBE
- 566℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 558℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)