当前位置: 代码网 > it编程>编程语言>Java > MyBatis 分页插件 PageHelper的不同使用方式

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

2026年05月15日 Java 我要评论
前言pagehelper 是 针对 mybatis 的一款分页插件,它支持常见 oracle、mysql、mariadb、sqlite、db2、postgresql、sqlserver 等 12 种数

前言

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com