引言:
在实际的应用开发中,分页查询是非常常见的需求。MyBatis作为一款流行的Java持久层框架,提供了多种方式来实现分页查询。本篇博客将介绍几种常用的MyBatis分页查询方式,并提供相应的代码示例,帮助读者更好地理解和应用。
一、基于数据库的分页查询
自定义RowBound.java
package com.smomo.springbootdemo1.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.ibatis.session.RowBounds;
/**
* @ClassName: RowBound
* @Description: TODO
* @Author: smomo
* @date: 2023/12/30 13:44
* @Version: V1.0
*/
@Data
public class RowBound {
public static final int NO_ROW_OFFSET = 0;
public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;
public static final RowBounds DEFAULT = new RowBounds();
private final int offset;
private final int limit;
public RowBound() {
this.offset = 0;
this.limit = Integer.MAX_VALUE;
}
public RowBound(int offset, int limit) {
this.offset = offset;
this.limit = limit;
}
public int getOffset() {
return this.offset;
}
public int getLimit() {
return this.limit;
}
}
这种方式是利用数据库的分页查询功能,如MySQL的LIMIT语句或Oracle的ROWNUM。在MyBatis中,可以使用RowBound
对象来指定分页的起始位置和数量。
- 在Mapper接口中定义方法:
List<User> getUsersByPage(RowBound rowBound);
- 在Mapper XML文件中实现方法:
<select id="getUsersByPage" resultType="User">
SELECT * FROM users
LIMIT #{offset}, #{limit}
</select>
- 在代码中调用方法时,需要传入
RowBounds
对象来设置分页的起始位置和数量:
int pageNo = 1;
int pageSize = 10;
int offset = (pageNo - 1) * pageSize;
RowBound rowBound = new RowBound(offset, pageSize);
List<User> users = userMapper.getUsersByPage(rowBounds);
二、基于插件的分页查询
MyBatis提供了一个分页插件PageHelper
,可以方便地实现分页查询。
- 引入
PageHelper
的依赖
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
- 在MyBatis的配置文件中配置插件。
注意:要进行配置,否则会报错
spring:
main:
allow-circular-references: true //允许循环引用
- 在Mapper接口中定义方法:
Page<Employees> getEmployeesByPag2();
- 在Mapper XML文件中实现方法:
<select id="getEmployeesByPag2" resultType="com.smomo.springbootdemo1.entity.Employees">
SELECT * FROM employees
</select>
- 在代码中调用方法时,不需要传入任何参数,
PageHelper
会自动根据当前页码和每页数量进行分页查询:
/**
* 根据分页获取员工列表
* @return 员工列表
*/
@Override
public List<Employees> getEmployeesByPag2() {
// 使用PageHelper插件设置分页参数,获取第1页,每页10条记录
PageHelper.startPage(1,10);
// 调用employeesMapper的getEmployeesByPag2方法获取分页结果
Page<Employees> res= employeesMapper.getEmployeesByPag2();
// 从分页结果中获取员工列表
List<Employees> result = res.getResult();
// 获取总记录数
long total = res.getTotal();
// 返回员工列表
return result;
}
三、基于拦截器的分页查询
这种方式是通过自定义拦截器来实现分页查询。拦截器会在执行SQL语句之前,修改SQL语句的内容,添加分页相关的语句。
1.配置方法
/**
* Mybatis Plus配置类
*/
@Configuration
public class MybatisPlusConfig {
/**
* 开启分页插件
* @return 分页插件实例
* @date: 2021/7/19 14:52
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
// 创建分页插件实例
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置最大分页条数为100
paginationInterceptor.setLimit(100);
// 设置使用JsqlParser进行优化的Count SQL解析器
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
// 设置数据库类型为MySQL
paginationInterceptor.setDbType(DbType.MYSQL);
// 返回分页插件实例
return paginationInterceptor;
}
}
- 在Mapper接口中定义方法:
List<User> getUsersByPage(@Param("pageNo") int pageNo, @Param("pageSize") int pageSize);
- 在Mapper XML文件中实现方法:
<select id="getUsersByPage" resultType="User">
SELECT * FROM users
</select>
- 在代码中调用方法时,需要传入页码和每页数量作为参数:
int pageNo = 1;
int pageSize = 10;
List<User> users = userMapper.getUsersByPage(pageNo, pageSize);
结语:
本篇博客介绍了MyBatis分页查询的多种方式,并提供了相应的代码示例。根据具体的需求和项目情况,选择合适的方式来实现分页查询。通过学习和实践这些方法,读者将能够更好地处理分页查询的需求,提高应用开发的效率和质量。希望本篇博客对读者有所帮助!