软件编程
位置:首页>> 软件编程>> java编程>> MyBatis分页插件PageHelper的使用与原理

MyBatis分页插件PageHelper的使用与原理

作者:@每天都要敲代码  发布时间:2021-06-15 09:24:35 

标签:MyBatis,分页插件,PageHelper

MyBatis使⽤PageHelper

1.limit分⻚

(1)概念:

①页码:pageNum(用户会发送请求,携带页码pageNum给服务器)

②每页显示的记录条数:pageSize,例如:百度默认的是每页展示10条记录

③实际上每一次在进行分页请求发送的时候,都是要发送两个数据:pageNum和pageSize给服务器

④实际上前端提交表单的数据格式应如下:uri?pageNum=1&pageSize=10,后端调用request.getParameter方法获取到对应的页码和每页显示的记录条数

(2)mysql当中的分页SQL应该怎么写?

①使用limit关键字,语法格式:limit startIndex,pageSize

②第⼀个数字:startIndex(起始下标,下标从0开始)

③第⼆个数字:pageSize(每⻚显示的记录条数)

④假设已知⻚码pageNum,还有每⻚显示的记录条数pageSize,那么第⼀个数字是可以动态的获取的:startIndex = (pageNum - 1) * pageSize

(3)标准通⽤的mysql分⻚SQL:

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

(4)使用limit关键字编写代码进行分页

三兄弟之一:CarMapper接口,编写方法

package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CarMapper {
   /**
    * 分页查询
    * @param startIndex 起始下标
    * @param pageSize  每页显示的记录条数
    * @return
    */
   List<Car> selectAllByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
}

三兄弟之二:CarMapper.xml文件,编写sql语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.CarMapper">
 <select id="selectAllByPage" resultType="Car" >
   select * from t_car limit #{startInde},#{pageSize}
 </select>
</mapper>

三兄弟之三:CarMappeTest类,用来编写测试类

package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class CarMapperTest {
   @Test
   public void testSelectAllByPage(){
       // 应该是从前端获取到页码
       int pageNum = 2;
       // 应该是从前端获取到每页显示的条数
       int pageSize = 2;
       // 起始下标
       int startIndex = (pageNum-1)*pageSize;
       SqlSession sqlSession = SqlSessionUtil.openSession();
       CarMapper mapper = sqlSession.getMapper(CarMapper.class);
       List<Car> cars = mapper.selectAllByPage(startIndex, pageSize);
       cars.forEach(car -> System.out.println(car));
       sqlSession.close();
   }
}

执行结果:

MyBatis分页插件PageHelper的使用与原理

对应的是数据库表中:起始下标为2开始的后两条数据(下标从0开始)

MyBatis分页插件PageHelper的使用与原理

(5)其实获取数据并不难,难的是获取分⻚相关的数据⽐较难(例如:总记录条数、是否有上/下一页、分页的导航显示多少个);这些可以借助mybatis的PageHelper插件。

MyBatis分页插件PageHelper的使用与原理

2.PageHelper插件

使⽤PageHelper插件进⾏分⻚,更加的便捷!

第一步:pom.xml中引入依赖

<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接口,编写方法

package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CarMapper {
   /**
    * 查询所有的Car,通过分页查询插件PageHelper完成
    * @return
    */
   List<Car> selectAll();
}

三兄弟之二:CarMapper.xml文件,编写sql语句

使用了分页插件PageHelper就不需要使用limit关键字了,直接正常查询即可!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.CarMapper">
 <select id="selectAll" resultType="Car">
     select * from t_car
 </select>
</mapper>

三兄弟之三:CarMappeTest类,用来编写测试类

注:在执行DQL语句之前,开启分页功能!

调用PageHelper的startPage(pageNum,pageSize)方法:

①第一个参数是页码pageNum

②第二个参数还是每页显示的记录条数pageSize

package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class CarMapperTest {
   @Test
   public void testSelectAll(){
       SqlSession sqlSession = SqlSessionUtil.openSession();
       CarMapper mapper = sqlSession.getMapper(CarMapper.class);
       // 在执行DQL语句之前,开启分页
       int pageNum = 2; // 第二页
       int pageSize = 3; // 每页显示的条数
       PageHelper.startPage(pageNum,pageSize);
       List<Car> cars = mapper.selectAll();
       cars.forEach(car -> System.out.println(car));
       sqlSession.close();
   }
}

执行结果:实际上PageHelper是在SQL语句后面自动加上了limit关键字

MyBatis分页插件PageHelper的使用与原理

第2页,每页显示的条数是3,对应的数据库表中的数据就是:

MyBatis分页插件PageHelper的使用与原理

第四步:获取PageInfo对象

关键点:

①在查询语句之前,开启分⻚功能。

②在查询语句之后,封装PageInfo对象(PageInfo对象将来会存储到request域当中。在⻚⾯上展示)

package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class CarMapperTest {
   @Test
   public void testSelectAll(){
       SqlSession sqlSession = SqlSessionUtil.openSession();
       CarMapper mapper = sqlSession.getMapper(CarMapper.class);
       // 1. 在执行DQL语句之前,开启分页
       int pageNum = 1; // 第一页
       int pageSize = 3; // 每页显示的条数
       PageHelper.startPage(pageNum,pageSize);
       // 2. 执行SQL语句
       List<Car> cars = mapper.selectAll();
       // 3. 执行DQL之后,封装PageInfo对象,new PageInfo对象
       // 第二个参数就是分页导航的卡片个数
       PageInfo<Car> carPageInfo = new PageInfo<>(cars, 3);
       System.out.println(carPageInfo);
       sqlSession.close();
   }
}

执行结果:

列举几个常用的属性:

①pageNum-页码, pageSize-每页显示的记录, size=3, startRow-从第几条数据开始, endRow-从第几条数据结束, total-总记录条数, pages-页数,

②prePage-上一页的页码, nextPage-下一页的页码, isFirstPage-,是否是第一页 isLastPage-是否是最后一页, hasPreviousPage-有没有上一页, hasNextPage-有没有下一页

③navigatePages-导航页码, navigateFirstPage-导航第一页是几, navigateLastPage-导航最后一页是几, navigatepageNums-存在数据的导航页

MyBatis分页插件PageHelper的使用与原理

怎么用?

在javaweb当中,代用request.setAttribute("pageInfo",carPageInfo)方法,把数据放到request域当中;然后从request域当中取出分页的信息,在前端进行展示!

来源:https://blog.csdn.net/m0_61933976/article/details/128619184

0
投稿

猜你喜欢

  • 字符串和列表学完,自己试着写了一个非常简单的Python名片管理系统。新萌尝试,大佬们不要喷。修改名片的功能我偷了个懒,因为我不知道怎么通过
  • java类的方法,我特别喜欢《java编程思想》里面的描述,这本书说java类之间的相互通信是通过消息。比如顾客类的对象调用一个eat方法,
  • 前言如果你想玩转C# 里面多线程,工厂模式,生产者/消费者,队列等高级操作,就可以和我一起探索这个强大的线程安全提供阻塞和限制功能的C#神器
  • 前言之前做移动端开发,都不清楚WebService是啥东东,现在接触c#,项目中有三处WebService调用,就不得不与其打交道了,最近碰
  • 前言sql注入是web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息、利用数据库的特性执行添加用户、导出文件等一系列恶意操作,甚
  • 简介今天的课程开始进入高级课程类了,我们要开始接触网络协议、设备等领域编程了。在今天的课程里我们会使用OKHttp组件来访问网络资源而不是使
  • 本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及final关键字对初始化的影响。另外,还讨论了由于继承原因,
  • JPA JpaRepository接口的使用SpringData的所有接口CrudRepository接口 ,其中提供了这些方法提供使用,同
  • 1、代码设计的代理模式代理模式属于构建型模式(Proxy),提供了对目标对象的一种访问方式; 即通过代理对象访问目标对象。这样做的好处是:可
  • 一、简介1.Apollo 是什么?Apollo(阿波罗)是携程框架部门研发的分布式配置中心。服务端基于Spring Boot和Spring
  • .NET具有较多的优点,如:标准集成,简化应用,对移动设备的支持等。但使用.NET编写的程序有个致命的缺点:易被反编译,且运行时占用较大的资
  • C#的特性record 类型、模式匹配、init 属性一、record 类型record ,我还是用原词吧,我知道有翻译为“记录类型”的说法
  • 一、注册表操作简介Registry类,RegistryKey类提供了操作注册表的接口RegistryValueKind:用于指定操作注册表的
  • 前言通过深入分析Spring源码,我们知道Spring框架包括大致六大模块, 如Web模块,数据库访问技术模块,面向切面模块,基础设施模块,
  • 在对类访问使用时,常用到的有访问类的成员、方法。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现。由于
  • 介绍超级管理员:系统管理、用户管理、网点管理、运输点管理、快递员管理、网点申请管理(审核)、报价管理(时效报价)等。普通用户:注册登录、个人
  • 本文实例为大家分享了java顺时针打印矩阵的具体代码,供大家参考,具体内容如下github:剑指offer编程题 import j
  • 做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈
  • 本文实例讲述了C#远程获取图片文件流的方法。分享给大家供大家参考,具体如下:protected void Page_Load(object
  • 设置session有效时间的三种方式session的默认有效时间是30分钟(min)方法一使用java函数:session.setMaxIn
手机版 软件编程 asp之家 www.aspxhome.com