当前位置:主页 > java教程 > MyBatis PageHelper

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

发布:2023-03-25 08:00:01 59


给大家整理一篇相关的编程文章,网友扈喜悦根据主题投稿了本篇教程内容,涉及到MyBatis分页插件PageHelper、MyBatis分页插件、MyBatis、PageHelper、MyBatis PageHelper相关内容,已被767网友关注,内容中涉及的知识点可以在下方直接下载获取。

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();
    }
}

执行结果:

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

(5)其实获取数据并不难,难的是获取分⻚相关的数据⽐较难(例如:总记录条数、是否有上/下一页、分页的导航显示多少个);这些可以借助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关键字

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

第四步:获取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-存在数据的导航页

怎么用?

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

到此这篇关于MyBatis分页插件PageHelper的使用与原理的文章就介绍到这了,更多相关MyBatis PageHelper内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • SpringBoot如何整合mybatis-generator-maven-plugin 1.4.0

    发布:2023-03-08

    这篇文章主要介绍了SpringBoot整合mybatis-generator-maven-plugin 1.4.0的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧


  • 实例详解mybatis的插件机制

    发布:2020-01-13

    这篇文章主要给大家介绍了关于mybatis插件机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧


  • MyBatis的mapper.xml文件中入参和返回值的实现

    发布:2023-03-03

    这篇文章主要介绍了MyBatis的mapper.xml文件中入参和返回值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Mybatis使用concat函数问题

    发布:2023-04-10

    这篇文章主要介绍了Mybatis使用concat函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Mybatis-Plus自动填充示例代码

    发布:2020-03-22

    这篇文章主要介绍了Mybatis-Plus自动填充的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • MyBatis注解式开发映射语句详解

    发布:2023-03-25

    这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作


  • Mybatis saveAndUpdate空值不更新问题及解决

    发布:2023-04-09

    这篇文章主要介绍了Mybatis saveAndUpdate空值不更新问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Mybatis特殊字符转义查询实现

    发布:2023-04-13

    本文主要介绍了Mybatis特殊字符转义查询实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


网友讨论