当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合PageHelper实现分页查询功能

SpringBoot整合PageHelper实现分页查询功能

2026年04月29日 Java 我要评论
一、为什么需要分页?如果不进行分页,那么就意味着要查询和渲染数据库中所有的符合条件的数据,会出现查询缓慢,渲染大量数据造成卡顿。分页查询是解决上述问题的经典方案。本文介绍在 spring boot +

一、为什么需要分页?

如果不进行分页,那么就意味着要查询和渲染数据库中所有的符合条件的数据,会出现查询缓慢,渲染大量数据造成卡顿。

分页查询是解决上述问题的经典方案。本文介绍在 spring boot + mybatis 项目中,如何使用 pagehelper 快速实现分页功能。

二、pagehelper 简介

pagehelper 是 mybatis 生态中非常流行的分页插件,它的核心优势在于:

1.操作简单,只需在查询前调用 startpage(),无需修改原有 sql。

2.自动化,自动拦截 sql,拼接 limit 语句并执行 count 查询,其原理就是帮你写limit语句。

3.易集成,提供 spring boot starter,开箱即用。

三、环境搭建

在 pom.xml 中添加 pagehelper 的 spring boot starter:

<!-- pagehelper 坐标 -->
<dependency>
    <groupid>com.github.pagehelper</groupid>
    <artifactid>pagehelper-spring-boot-starter</artifactid>
    <version>1.4.6</version>
</dependency>

为了前后端数据格式统一,定义一个通用的分页结果类 pagebean:

public class pagebean<t> {
    private long total;      // 总记录数
    private list<t> items;   // 当前页数据列表
}

total:告诉前端一共有多少条数据,用于计算总页数
items:当前页的具体数据

四、核心使用方式

十分简单,只需一行代码就能开启分页查询:

//开启分页查询 pagehelp
pagehelper.startpage(pagenum,pagesize);
//直接进入mapper层即可,pagehelper会自动插入limit语句
list<article>as= articlemapper.list(userid,categoryid,state);

五、实战:文章列表分页查询

 以项目中的文章列表查询为例,完整展示从 controller 到 mapper 的分页实现链路。

controller 层


接收前端传来的分页参数和查询条件:

@getmapping
public result<pagebean<article>> list(
    integer pagenum,
    integer pagesize,
    @requestparam(required = false) integer categoryid,
    @requestparam(required = false) string state
) {
    pagebean<article> pb = articleservice.list(pagenum, pagesize, categoryid, state);
    return result.success(pb);
}

要点说明:
pagenum:当前页码(从 1 开始)
pagesize:每页显示条数
categoryid 和 state 是业务查询条件,使用 required = false 表示可选

注意返回值的类型。

service 层

这是分页逻辑的核心层:

@override
public pagebean<article> list(integer pagenum, integer pagesize, 
                              integer categoryid, string state) {
    // 1. 创建 pagebean 对象
    pagebean<article> pb = new pagebean<>();

    // 2. 开启分页查询
    pagehelper.startpage(pagenum, pagesize);

    // 3. 调用 mapper 查询(此时返回的 list 实际是 page 类型)
    map<string, object> map = threadlocalutil.get();
    integer userid = (integer) map.get("id");
    list<article> as = articlemapper.list(userid, categoryid, state);

    // 4. 强转为 page 对象,获取分页信息
    page<article> p = (page<article>) as;

    // 5. 封装结果
    pb.settotal(p.gettotal());
    pb.setitems(p.getresult());
    return pb;
}

第四步转化的目的是使用page类中的方法获取具体的分页信息,这个类是由pagehelper提供的。

mapper 层

正常写就行,没有什么变动:

<select id="list" resulttype="org.example.pojo.article">
    select * from article
    <where>
        <if test="categoryid != null">
            category_id = #{categoryid}
        </if>
        <if test="state != null">
            and state = #{state}
        </if>
        and create_user = #{userid}
    </where>
</select>

pagehelper 会自动完成两件事:
执行 count 查询:select count(*) from article where ...
拼接分页 sql:在原 sql 后添加 limit offset, pagesize

六、pagehelper 工作原理(简述)

pagehelper 通过 mybatis 的 interceptor(拦截器) 机制,在执行查询时自动改写 sql。startpage() 方法将分页参数放入 threadlocal,确保同一线程中的下一次查询被拦截处理。属于aop编程思想,但并不是通过springboot的aop实现的,而是基于mybatis的拦截机制。

七、总结

通过 pagehelper,我们在 spring boot 项目中实现了近乎零侵入的分页功能:
加依赖:pagehelper-spring-boot-starter
封装结果 : pagebean<t>
一行开启 : pagehelper.startpage(pagenum, pagesize)
正常查询 : mapper sql 无需改动

进行强转:list->page
提取结果 : page.gettotal() + page.getresult()
这种设计让分页逻辑与业务代码完全解耦,是我们日常开发中非常推荐的分页方案。

以上就是springboot整合pagehelper实现分页查询功能的详细内容,更多关于springboot pagehelper分页查询的资料请关注代码网其它相关文章!

(0)

相关文章:

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

发表评论

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