java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis 分页插件 PageHelper

MyBatis 分页插件 PageHelper的不同使用方式

作者:西凉的悲伤

文章介绍了MyBatis分页插件PageHelper的使用方法,并提供了多种使用方式的示例,需要注意的是,插件只能为紧跟在startPage方法后的第一个mybatis查询方法进行分页,且不支持带有forupdate语句的查询,感兴趣的朋友跟随小编一起看看吧

前言

PageHelper 是 针对 MyBatis 的一款分页插件,它支持常见 Oracle、MySql、MariaDB、SQLite、DB2、PostgreSQL、SqlServer 等 12 种数据库分页,它支持常见的RowBounds(PageRowBounds)、PageHelper.startPage 方法调用、Mapper 接口参数调用等多种分页方式。

官网

github

一、依赖

<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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文