MyBatis分页插件PageHelper的使用与原理
@每天都要敲代码 人气:0MyBatis使⽤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域当中取出分页的信息,在前端进行展示!
加载全部内容