首页技术文章正文

分页查询怎么写?Mybatis分页插件PageHelper

更新时间:2023-07-26 来源:黑马程序员 浏览量:

如果数据库中的数据有很多(假设有十几万条)的时候,将数据全部展示出来肯定不现实,这时使用分页解决这个问题,每次只展示一页的数据,比如:一页展示10条数据,如果还想看其他的数据,可以通过点击页码进行查询。

分页查询

要想从数据库中进行分页查询,我们要使用LIMIT关键字,格式为:limit 开始索引 每页显示的条数。

查询第1页数据的SQL语句是:

select * from emp  limit 0,10;

查询第2页数据的SQL语句是:

select * from emp  limit 10,10;

查询第3页数据的SQL语句是:

select * from emp  limit 20,10;

观察以上SQL语句,发现: 开始索引一直在改变 , 每页显示条数是固定的开始索引的计算公式:

开始索引 = (当前页码 - 1) * 每页显示条数

我们继续基于页面原型,继续分析,得出以下结论:

前端在请求服务端时,传递的参数

       当前页码 page

       每页显示条数 pageSize

后端需要响应什么数据给前端

       所查询到的数据列表(存储到List 集合中)

       总记录数
1690352900807_图2.png

后台给前端返回的数据包含:List集合(数据列表)、total(总记录数),而这两部分我们通常封装到PageBean对象中,并将该对象转换为json格式的数据响应回给浏览器。

以上是基础的分页查询,大家会发现,分页查询功能编写起来比较繁琐。而在Mapper接口中定义两个方法执行两条不同的SQL语句:

       • 查询总记录数

       • 指定页码的数据列表

在Service当中,调用Mapper接口的两个方法,分别获取:总记录数、查询结果列表,然后在将获取的数据结果封装到PageBean对象中。

在未来开发其他项目,只要涉及到分页查询功能(例:订单、用户、支付、商品),都必须按照以上操作完成功能开发,原始方式的分页查询,存在着"步骤固定"、"代码频繁"的问题。

可以使用一些现成的分页插件完成。对于Mybatis来讲现在最主流的就是PageHelper。PageHelper是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。

官网:https://pagehelper.github.io/
PageHelper

在执行empMapper.list()方法时,就是执行:select * from emp 语句,怎么能够实现分页操作呢?

分页插件帮我们完成了以下操作:

       • 先获取到要执行的SQL语句:select * from emp

       • 把SQL语句中的字段列表,变为:count(*)

       • 执行SQL语句:select count(*) from emp //获取到总记录数

       • 再对要执行的SQL语句:select * from emp 进行改造,在末尾添加 limit ? , ?

       • 执行改造后的SQL语句:select * from emp limit ? , ?

代码实现

当使用了PageHelper分页插件进行分页,就无需再Mapper中进行手动分页了。 在Mapper中我们只需要进行正常的列表查询即可。在Service层中,调用Mapper的方法之前设置分页参数,在调用Mapper方法执行查询之后,解析分页结果,并将结果封装到PageBean对象中返回。

1、在pom.xml引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

2、EmpMapper

@Mapper
public interface EmpMapper {
    //获取当前页的结果列表
    @Select("select * from emp")
    public List<Emp> page(Integer start, Integer pageSize);
}

3、EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {
    // 设置分页参数
    PageHelper.startPage(page, pageSize); 
    // 执行分页查询
    List<Emp> empList = empMapper.list(name,gender,begin,end); 
    // 获取分页结果
    Page<Emp> p = (Page<Emp>) empList;   
    //封装PageBean
    PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); 
    return pageBean;
}

功能开发完成后,我们重启项目工程,打开postman,发起GET请求,访问 :http://localhost:8080/emps?page=1&pageSize=5

发起GET请求

后端程序SQL输出:

实现分页查询.png

分享到:
在线咨询 我要报名
和我们在线交谈!