一、为什么需要分页?
如果不进行分页,那么就意味着要查询和渲染数据库中所有的符合条件的数据,会出现查询缓慢,渲染大量数据造成卡顿。
分页查询是解决上述问题的经典方案。本文介绍在 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分页查询的资料请关注代码网其它相关文章!
发表评论