MyBatis 分页插件 PageHelper的不同使用方式
作者:西凉的悲伤
前言
PageHelper 是 针对 MyBatis 的一款分页插件,它支持常见 Oracle、MySql、MariaDB、SQLite、DB2、PostgreSQL、SqlServer 等 12 种数据库分页,它支持常见的RowBounds(PageRowBounds)、PageHelper.startPage 方法调用、Mapper 接口参数调用等多种分页方式。
一、依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>6.1.1</version>
<scope>compile</scope>
</dependency>二、分页插件的不同使用方式
第一种(推荐)
//Mapper接口方式的调用,推荐这种使用方式。 PageHelper.startPage(1, 10); List<User> list = userMapper.selectIf(1);
注意:只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
第二种
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
第三种
PageHelper.offsetPage(0, 10); List<User> list = userMapper.selectIf(1);
第四种(参数方法调用)
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<User> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);第五种(参数对象)
/如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下面两个参数名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);三、重要提示
1.只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
2.不要配置多个分页插件
不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!
3.分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。
4.分页插件不支持嵌套结果映射
由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
四、示例
示例一
Controller 层接口:
@PostMapping("/queryList")
public ResponseEntity<PageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
PageInfo<ReconcileOrderDto> pageInfo = new PageInfo<>(orderList);
return ResponseEntity.ok().body(pageInfo);
}
service 方法:
public List<ReconcileOrderDto> queryList(ReconcileOrderRequest request) {
ReconcileOrderPageDto orderPageDto = buildReconcileOrderPageDto(request);
//分页查询
PageHelper.startPage(request.getPage(), request.getPageSize());
List<ReconcileOrderDto> pageReconcile = operateOrderMapper.selectOrderByReconcileTime(orderPageDto);
return pageReconcile;
}
示例二
上面使用了 PageInfo ,除了使用 PageHelper 自带的 PageInfo 分页类,也可以自己定义分页类。
import com.github.pagehelper.Page;
import lombok.ToString;
import java.util.List;
@ToString
public class MyPageInfo<T>{
/**
* 总条数
*/
private int total;
/**
* 条数
*/
private int size;
/**
* 每页条数
*/
private int pageSize;
/**
* 当前页码
*/
private int pageNum;
/**
* 分页数据
*/
private List<T> list;
public MyPageInfo(String code, String message, int size, int pageSize, int pageNum, int total, List<T> data) {
super(code, message);
this.size = size;
this.pageSize = pageSize;
this.pageNum = pageNum;
this.list = data;
this.total = total;
}
public MyPageInfo(String code, String message, List<T> data) {
super(code, message);
this.list = data;
}
public MyPageInfo(List<T> data) {
this.list = data;
if (data instanceof Page) {
Page<T> page = (Page<T>) data;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.size = page.size();
this.total = (int) page.getTotal();
} else if (data != null) {
this.pageNum = 1;
this.pageSize = data.size();
this.size = data.size();
this.total = data.size();
}
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public Object getList() {
return list;
}
public void setList(List<T> data) {
this.list = data;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}上面的 自定义分页类 MyPageInfo 含有 total、size等方法,你还可以增加其他字段,比如 sucess来标识请求是否成功、errorMessage 错误消息等。
使用 MyPageInfo 后,示例一的 代码可以修改为:
@PostMapping("/queryList")
public ResponseEntity<MyPageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
MyPageInfo<ReconcileOrderDto> myPageInfo = new MyPageInfo<>(orderList);
return ResponseEntity.ok().body(myPageInfo );
}
到此这篇关于MyBatis 分页插件 PageHelper的不同使用方式的文章就介绍到这了,更多相关MyBatis 分页插件 PageHelper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- Mybatis分页插件Pagehelper不生效的原因及解决
- Springboot整合mybatis-plus使用pageHelper进行分页(使用步骤)
- Springboot Mybatis使用pageHelper如何实现分页查询
- Mybatis分页插件Pagehelper的PageInfo字段属性使用及解释
- MyBatis中使用分页插件PageHelper实现分页功能
- 解决mybatis分页插件PageHelper导致自定义拦截器失效
- Mybatis-Plus或PageHelper多表分页查询总条数不对问题的解决方法
- springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能
- Mybatis分页查询的实现(Rowbounds和PageHelper)
