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

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

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

标签:MyBatis,分页插件,PageHelper
0
投稿

猜你喜欢

  • C# 文字代码页 文字编码的代码页名称速查表

    2023-12-13 04:03:54
  • Java的后台文件夹下文件的遍历完整代码

    2023-09-18 12:32:19
  • Java微信公众平台开发(11) 微信三大平台的关联

    2022-10-15 06:55:56
  • 通过实例解析Spring argNames属性

    2023-09-14 10:43:13
  • Java为何需要平衡方法调用与内联

    2023-01-02 20:37:22
  • mybatis-plus乐观锁实现方式详解

    2022-09-27 16:12:27
  • java并发编程工具类JUC之ArrayBlockingQueue

    2023-07-04 21:02:20
  • 基于@GetMapping注解携带参数的方式

    2023-01-26 20:49:32
  • C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法

    2023-07-15 21:35:09
  • IDEA 中使用 Hudi的示例代码

    2021-08-27 21:51:04
  • Hibernate5新特性介绍

    2023-01-02 16:28:09
  • sharding-jdbc5.0.0实现分表实践

    2023-12-07 10:12:26
  • 使用cmd根据WSDL网址生成java客户端代码的实现

    2022-09-12 11:00:20
  • Android下拉列表spinner的实例代码

    2023-07-31 20:39:47
  • Java Socket编程实例(一)- TCP基本使用

    2023-11-11 08:42:50
  • 浅谈java的byte数组的不同写法

    2023-03-10 07:53:12
  • java实现一个简单的网络爬虫代码示例

    2021-08-05 13:59:12
  • 打印Java程序的线程栈信息方式

    2021-11-02 19:00:28
  • Java线程的生命周期命名与获取代码实现

    2022-05-21 05:19:49
  • 一看就懂的Android APP开发入门教程

    2023-07-18 04:10:41
  • asp之家 软件编程 m.aspxhome.com