MyBatis如何实现分页查询?_mybatis collection分页查询
一句话总结
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 依赖。
相关文章
- MyBatis如何实现分页查询?_mybatis collection分页查询
- 通过Mybatis Plus实现代码生成器,常见接口实现讲解
- MyBatis-Plus 日常使用指南_mybatis-plus用法
- 聊聊:Mybatis-Plus 新增获取自增列id,这一次帮你总结好
- MyBatis-Plus码之重器 lambda 表达式使用指南,开发效率瞬间提升80%
- Spring Boot整合MybatisPlus和Druid
- mybatis 代码生成插件free-idea-mybatis、mybatisX
- mybatis-plus 团队新作 mybatis-mate 轻松搞定企业级数据处理
- Maven 依赖范围(scope) 和 可选依赖(optional)
- Trace Sql:打通全链路日志最后一里路