(十四)MyBatis的分页与PageHelper插件

Mybatis学习目录

上一篇:(十三)MyBatis的逆向工程
下一篇:(十五)MyBatis的注解式开发

环境

数据库:汽车表t_car
引⼊依赖:mysql驱动依赖、mybatis依赖、logback依赖、junit依赖。
引入配置文件:jdbc.properties、mybatis-config.xml、logback.xml
SqlSession工具类:SqlSessionUtil
都可以复制之前的

limit分页

在Mysql当中的limit语句有两个参数:

	select * from t_car limit 参数一,参数二

参数一:起始下标,默认下标从0开始(startIndex)
参数二:显示的记录条数(pageSize)

假设已知页码pageNum,还有每页显示的记录条数pageSize,那么参数一就可以动态获取

startIndex = (pageNum - 1) * pageSize

所以,标准通用的Mysql分页SQL:

select
 *
from
 表 ......
limit
 (pageNum - 1) * pageSize, pageSize

MyBatis中使用limit分页

创建CarMapper接口,添加方法:

    /**
     * 分页查询,原生limit
     * @param startIndex 起始下标
     * @param pageSize 每页记录条数
     * @return
     */
    List<Car> selectByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

创建CarMapper.xml文件配置:

    <select id="selectByPage" resultType="car">

        select *
        from t_car
        limit #{startIndex},#{pageSize}
            
    </select>

测试程序:

    @Test
    public void testSelectByPage(){
        SqlSession session = SqlSessionUtil.getSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        int pageSize = 3;//每页显示条数
        int pageNum = 3; //显示第几页
        //计算开始下标
        int startIndex = (pageNum-1)*pageSize;

        List<Car> cars = mapper.selectByPage(startIndex,pageSize);

        cars.forEach(car -> System.out.println(car));
    }

请添加图片描述

PageHelper插件分页

获取数据不难,难的是获取分页相关的数据比较难。可以借助mybatis的PageHelper插件。
使用PageHelper步骤:
第一步:引入依赖

    <!--mybatis的插件pagehelper-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.1</version>
    </dependency>

第⼆步:在mybatis-config.xml文件中配置插件

    <!--mybatis分页的拦截器-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

第三步:编写Java代码
在CarMapper接口添加方法:

    /**
     * 查询所有,通过分页查询插件PageHelper
     * @return
     */
    List<Car> selectAll();

在CarMapper.xml配置:
不用使用limit关键字

    <select id="selectAll" resultType="car">

        select *
        from t_car

    </select>
    @Test
    public void testSelectByPageHelper(){
        SqlSession session = SqlSessionUtil.getSession();
        CarMapper mapper = session.getMapper(CarMapper.class);

        //在执行DQL语句之前,需要开启分页功能
        int pageSize = 3;//每页显示条数
        int pageNum = 2; //显示第几页
        PageHelper.startPage(pageNum,pageSize);

        List<Car> cars = mapper.selectAll();
        cars.forEach(car -> System.out.println(car));
    }

运行后可以发现启动了PageHelper插件
请添加图片描述
请添加图片描述

PageInfo对象

在查询语句之后封装PageInfo对象。(PageInfo对象将来会存储到request域当中。在页面上展示。)
程序:

    @Test
    public void testSelectByPageHelper1(){
        SqlSession session = SqlSessionUtil.getSession();
        CarMapper mapper = session.getMapper(CarMapper.class);

        //在执行DQL语句之前,需要开启分页功能
        int pageSize = 3;//每页显示条数,将来从前端获取
        int pageNum = 2; //显示第几页,也是从前端获取
        PageHelper.startPage(pageNum,pageSize);

        List<Car> cars = mapper.selectAll();
        //PageInfo对象是PageHelper插件提供用来封装分页信息的对象。
        //这个对象将来会存储到request当中,传给前端展示
        PageInfo<Car> carPageInfo = new PageInfo<>(cars, 2);
       	//我们可以输出看运行这个对象的信息
        System.out.println(carPageInfo);
        
    }

发现这个对象有很多信息
请添加图片描述

PageInfo{pageNum=2, pageSize=3, size=3, startRow=4, endRow=6, total=8, pages=3, 
list=Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=8, pages=3, reasonable=false, pageSizeZero=false}
[Car{id=28, carNum='333', brand='帕萨特3', guidePrice=30.0, produceTime='2020-11-11', carType='燃油车'}, 
Car{id=29, carNum='8888', brand='兰博基尼X', guidePrice=100.0, produceTime='2020-1-1', carType='燃油车'}, 
Car{id=30, carNum='5555', brand='比亚迪T', guidePrice=30.0, produceTime='2020-11-11', carType='新能源'}], 
prePage=1, nextPage=3, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true, 
navigatePages=2, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}

这些信息分别表示:

  • pageNum:当前页码
  • pageSize:每页记录条数
  • size:当前页的数据条数
  • startRow:当前页面在数据库当中从第几条开始,不包括开始(左开右闭)
  • endRow:当前页面在数据库当中从第几条结束,包括结束(左开右闭)
  • total:总记录条数
  • pages:总记录的分页数
  • list:当前页的数据,里面的startRow和endRow是都包括(左闭右闭)
  • prePage:当前页上一页的页码
  • nextPage:当前页下一页的页码
  • isFirstPage:当前页是否为第一页
  • isLastPage:当前页是否为最后一页
  • hasPreviousPage:当前页是否有上一页
  • hasNextPage:当前页是否有下一页
  • navigatePages:导航页数
  • navigateFirstPage:导航页的第一页页码
  • navigateLastPage:导航页的最后一页页码
  • navigatepageNums:所有导航页号
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆亦何为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值