• (十四)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 参数一,参数二
    
    • 1

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

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

    startIndex = (pageNum - 1) * pageSize
    
    • 1

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

    select
     *
    from
     表 ......
    limit
     (pageNum - 1) * pageSize, pageSize
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    MyBatis中使用limit分页

    创建CarMapper接口,添加方法:

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

    创建CarMapper.xml文件配置:

        <select id="selectByPage" resultType="car">
    
            select *
            from t_car
            limit #{startIndex},#{pageSize}
                
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试程序:

        @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));
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    请添加图片描述

    PageHelper插件分页

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

        <!--mybatis的插件pagehelper-->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>5.3.1</version>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

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

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

        <select id="selectAll" resultType="car">
    
            select *
            from t_car
    
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
        @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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行后可以发现启动了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);
            
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    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]}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这些信息分别表示:

    • pageNum:当前页码
    • pageSize:每页记录条数
    • size:当前页的数据条数
    • startRow:当前页面在数据库当中从第几条开始,不包括开始(左开右闭)
    • endRow:当前页面在数据库当中从第几条结束,包括结束(左开右闭)
    • total:总记录条数
    • pages:总记录的分页数
    • list:当前页的数据,里面的startRow和endRow是都包括(左闭右闭)
    • prePage:当前页上一页的页码
    • nextPage:当前页下一页的页码
    • isFirstPage:当前页是否为第一页
    • isLastPage:当前页是否为最后一页
    • hasPreviousPage:当前页是否有上一页
    • hasNextPage:当前页是否有下一页
    • navigatePages:导航页数
    • navigateFirstPage:导航页的第一页页码
    • navigateLastPage:导航页的最后一页页码
    • navigatepageNums:所有导航页号
  • 相关阅读:
    GetPrivateProfileSection使用
    【k8s】Pod 的钩子
    rsync远程同步
    [机器学习] 通俗理解机器学习分类模型评估指标-准确率、精准率、召回率
    JavaEE项目的数据分析师、软件工程师
    CSS语法及其选择器
    Go语学习笔记 - gorm使用 - 原生sql、命名参数、Rows、ToSQL | Web框架Gin(九)
    sip可视化触屏话机
    解决线上概率性异常 TransactionTooLargeException
    Transfer Learning with MobileNetV2(吴恩达课程)
  • 原文地址:https://blog.csdn.net/weixin_45832694/article/details/127768014