MyBatis分頁插件PageHelper的使用與原理
MyBatis使?PageHelper
1.limit分?
(1)概念:
①頁碼:pageNum(用戶會發(fā)送請求,攜帶頁碼pageNum給服務(wù)器)
②每頁顯示的記錄條數(shù):pageSize,例如:百度默認(rèn)的是每頁展示10條記錄
③實際上每一次在進(jìn)行分頁請求發(fā)送的時候,都是要發(fā)送兩個數(shù)據(jù):pageNum和pageSize給服務(wù)器
④實際上前端提交表單的數(shù)據(jù)格式應(yīng)如下:uri?pageNum=1&pageSize=10,后端調(diào)用request.getParameter方法獲取到對應(yīng)的頁碼和每頁顯示的記錄條數(shù)
(2)mysql當(dāng)中的分頁SQL應(yīng)該怎么寫?
①使用limit關(guān)鍵字,語法格式:limit startIndex,pageSize
②第?個數(shù)字:startIndex(起始下標(biāo),下標(biāo)從0開始)
③第?個數(shù)字:pageSize(每?顯示的記錄條數(shù))
④假設(shè)已知?碼pageNum,還有每?顯示的記錄條數(shù)pageSize,那么第?個數(shù)字是可以動態(tài)的獲取的:startIndex = (pageNum - 1) * pageSize
(3)標(biāo)準(zhǔn)通?的mysql分?SQL:
select * from tableName ...... limit (pageNum - 1) * pageSize, pageSize
(4)使用limit關(guān)鍵字編寫代碼進(jìn)行分頁
三兄弟之一: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 起始下標(biāo)
* @param pageSize 每頁顯示的記錄條數(shù)
* @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(){
// 應(yīng)該是從前端獲取到頁碼
int pageNum = 2;
// 應(yīng)該是從前端獲取到每頁顯示的條數(shù)
int pageSize = 2;
// 起始下標(biāo)
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();
}
}執(zhí)行結(jié)果:

對應(yīng)的是數(shù)據(jù)庫表中:起始下標(biāo)為2開始的后兩條數(shù)據(jù)(下標(biāo)從0開始)

(5)其實獲取數(shù)據(jù)并不難,難的是獲取分?相關(guān)的數(shù)據(jù)?較難(例如:總記錄條數(shù)、是否有上/下一頁、分頁的導(dǎo)航顯示多少個);這些可以借助mybatis的PageHelper插件。

2.PageHelper插件
使?PageHelper插件進(jìn)?分?,更加的便捷!
第一步: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關(guān)鍵字了,直接正常查詢即可!
<?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類,用來編寫測試類
注:在執(zhí)行DQL語句之前,開啟分頁功能!
調(diào)用PageHelper的startPage(pageNum,pageSize)方法:
①第一個參數(shù)是頁碼pageNum
②第二個參數(shù)還是每頁顯示的記錄條數(shù)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);
// 在執(zhí)行DQL語句之前,開啟分頁
int pageNum = 2; // 第二頁
int pageSize = 3; // 每頁顯示的條數(shù)
PageHelper.startPage(pageNum,pageSize);
List<Car> cars = mapper.selectAll();
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
}執(zhí)行結(jié)果:實際上PageHelper是在SQL語句后面自動加上了limit關(guān)鍵字

第2頁,每頁顯示的條數(shù)是3,對應(yīng)的數(shù)據(jù)庫表中的數(shù)據(jù)就是:

第四步:獲取PageInfo對象
關(guān)鍵點(diǎn):
①在查詢語句之前,開啟分?功能。
②在查詢語句之后,封裝PageInfo對象(PageInfo對象將來會存儲到request域當(dāng)中。在??上展示)
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. 在執(zhí)行DQL語句之前,開啟分頁
int pageNum = 1; // 第一頁
int pageSize = 3; // 每頁顯示的條數(shù)
PageHelper.startPage(pageNum,pageSize);
// 2. 執(zhí)行SQL語句
List<Car> cars = mapper.selectAll();
// 3. 執(zhí)行DQL之后,封裝PageInfo對象,new PageInfo對象
// 第二個參數(shù)就是分頁導(dǎo)航的卡片個數(shù)
PageInfo<Car> carPageInfo = new PageInfo<>(cars, 3);
System.out.println(carPageInfo);
sqlSession.close();
}
}執(zhí)行結(jié)果:
列舉幾個常用的屬性:
①pageNum-頁碼, pageSize-每頁顯示的記錄, size=3, startRow-從第幾條數(shù)據(jù)開始, endRow-從第幾條數(shù)據(jù)結(jié)束, total-總記錄條數(shù), pages-頁數(shù),
②prePage-上一頁的頁碼, nextPage-下一頁的頁碼, isFirstPage-,是否是第一頁 isLastPage-是否是最后一頁, hasPreviousPage-有沒有上一頁, hasNextPage-有沒有下一頁
③navigatePages-導(dǎo)航頁碼, navigateFirstPage-導(dǎo)航第一頁是幾, navigateLastPage-導(dǎo)航最后一頁是幾, navigatepageNums-存在數(shù)據(jù)的導(dǎo)航頁

怎么用?
在javaweb當(dāng)中,代用request.setAttribute("pageInfo",carPageInfo)方法,把數(shù)據(jù)放到request域當(dāng)中;然后從request域當(dāng)中取出分頁的信息,在前端進(jìn)行展示!
到此這篇關(guān)于MyBatis分頁插件PageHelper的使用與原理的文章就介紹到這了,更多相關(guān)MyBatis PageHelper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談spring的重試機(jī)制無效@Retryable@EnableRetry
這篇文章主要介紹了淺談spring的重試機(jī)制無效@Retryable@EnableRetry,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot-application.yml多環(huán)境配置詳解
本文主要介紹了SpringBoot-application.yml多環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SpringCloudGateway?Nacos?GitlabRunner全自動灰度服務(wù)搭建發(fā)布
這篇文章主要為大家介紹了SpringCloudGateway?Nacos?GitlabRunner全自動灰度服務(wù)搭建和發(fā)布實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java string類型轉(zhuǎn)換成map代碼實例
這篇文章主要介紹了Java string類型轉(zhuǎn)換成map代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03

