SpringBoot整合MyBatis四種常用的分頁方式(詳細總結)
一、準備工作
1. 創(chuàng)建表結構
CREATE TABLE `order_info` ( `id` int NOT NULL AUTO_INCREMENT, `info` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `time` datetime NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
2. 導入表數據
INSERT INTO `order_info` VALUES (1, '購買了手機', '2022-08-25 05:34:17'); INSERT INTO `order_info` VALUES (2, '購買了電腦', '2022-08-25 07:30:39'); INSERT INTO `order_info` VALUES (3, '購買了護手霜', '2022-08-17 22:35:07'); INSERT INTO `order_info` VALUES (4, '購買了泡面', '2022-08-23 08:35:36'); INSERT INTO `order_info` VALUES (5, '購買了紙巾', '2022-07-21 15:26:06'); INSERT INTO `order_info` VALUES (6, '購買了自熱米飯', '2021-06-20 13:21:06'); INSERT INTO `order_info` VALUES (7, '購買了移動硬盤', '2022-06-11 11:22:03'); INSERT INTO `order_info` VALUES (8, '購買了狗糧', '2022-05-10 11:21:02'); INSERT INTO `order_info` VALUES (9, '購買了貓糧', '2022-04-10 09:11:02'); INSERT INTO `order_info` VALUES (10, '購買了遙控器', '2022-08-22 22:35:07'); INSERT INTO `order_info` VALUES (11, '購買了褲子', '2022-08-15 08:35:36'); INSERT INTO `order_info` VALUES (12, '購買了鞋子', '2022-08-21 08:35:36'); INSERT INTO `order_info` VALUES (13, '購買了水杯', '2022-08-26 19:39:19');
3. 導入pom.xml依賴
創(chuàng)建新的工程的步驟我這里就省略了,所以廢話不多說,直接進入正題!
注:請不要重復導入MyBatis的依賴,這里為了方便展示寫到一起了,實際運用的時候,請不要混合在一起導入,不然可能會導致jar包的沖突,PageHelper和MyBatis-plus的jar包可能會產生沖突的。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Mybatis依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--PageHelper依賴-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.3</version>
</dependency>
<!--Mybatis-Plus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>4. 配置application.yml文件
server:
port: 8080
spring:
datasource:
username: 你的mysql用戶名
password: 你的mysql密碼
url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*.xml5. 創(chuàng)建公用的實體類
package com.ithuang.demo.bean;
import java.util.Date;
public class OrderInfo {
private int id;
private String info;
private Date time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@Override
public String toString() {
return "OrderInfo{" +
"id=" + id +
", info='" + info + '\'' +
", time=" + time +
'}';
}
}二、使用原生Limit關鍵字進行分頁
1. 項目整體結構

2. 創(chuàng)建controller層
package com.ithuang.demo.controller;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.service.OrderInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class OrderInfoController {
@Resource
private OrderInfoService orderInfoService;
@GetMapping("/getOrderInfoList")
public List<OrderInfo> getOrderInfoList(@RequestParam(value = "pageNow",defaultValue = "1") int pageNow,
@RequestParam(value = "pageSize",defaultValue = "3") int pageSize){
return orderInfoService.getOrderInfoList(pageNow,pageSize);
}
}3. 創(chuàng)建service層
package com.ithuang.demo.service;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.mapper.OrderInfoMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class OrderInfoService {
@Resource
private OrderInfoMapper orderInfoMapper;
public List<OrderInfo> getOrderInfoList(int pageNow, int pageSize) {
if(pageNow == 1){
pageNow = 0;
}
return orderInfoMapper.getOrderInfoList(pageNow,pageSize);
}
}4. 創(chuàng)建mapper層
package com.ithuang.demo.mapper;
import com.ithuang.demo.bean.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface OrderInfoMapper {
List<OrderInfo> getOrderInfoList(@Param("pageNow") int pageNow,@Param("pageSize") int pageSize);
}5. 創(chuàng)建xml文件
<?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.ithuang.demo.mapper.OrderInfoMapper">
<select id="getOrderInfoList" parameterType="int" resultType="com.ithuang.demo.bean.OrderInfo">
SELECT * FROM order_info limit #{pageNow},#{pageSize}
</select>
</mapper>6. 使用postman進行測試,測試結果如下

三、借助MyBatis提供的第三方PageHelper分頁插件1
在MyBatis中配置了分頁攔截器(PageInterceptor),就是在執(zhí)行相關的Sql之前會做一些攔截的操作,這里通過調用startPage的方法,其實就是在查詢getOrderInfoList之前會自動加上limit;這里通過setLocalPage方法,將分頁信息保存在當前之后線程當中,查詢方法與之處于同一個線程,共享ThreadLocal當中的數據,最后將getOrderInfoList查詢好的數據結果放到PageInfo當中即可。
擴展:PageHelper.startPage(int PageNum,int PageSize):用來設置頁面的位置和展示的數據條目數,我們設置每頁展示5條數據。PageInfo用來封裝頁面信息,返回給前臺界面。PageInfo中的一些我們需要用到的參數如下表:
| PageInfo.list | 結果集 |
| PageInfo.pageNum | 當前頁碼 |
| PageInfo.pageSize | 當前頁面顯示的數據條目 |
| PageInfo.pages | 總頁數 |
| PageInfo.total | 數據的總條目數 |
| PageInfo.prePage | 上一頁 |
| PageInfo.nextPage | 下一頁 |
| PageInfo.isFirstPage | 是否為第一頁 |
| PageInfo.isLastPage | 是否為最后一頁 |
| PageInfo.hasPreviousPage | 是否有上一頁 |
| PageHelper.hasNextPage | 是否有下一頁 |
(1)引入pom.xml
<!-- 分頁插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>(2)打開application.properties,添加如下幾行配置信息
#分頁插件 pagehelper.helper-dialect=mysql pagehelper.params=count=countSql pagehelper.reasonable=true pagehelper.support-methods-arguments=true
1. 項目整體結構

2. 創(chuàng)建controller層
Mapper文件中, SQL不用增加 limit分頁指令,需要什么直接查就可以,Pagehelper 可以自動實現分頁!
package com.ithuang.demo.controller;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.service.OrderInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class OrderInfoController {
@Resource
private OrderInfoService orderInfoService;
@GetMapping("/getOrderInfoList")
public List<OrderInfo> getOrderInfoList(@RequestParam(value = "pageNow",defaultValue = "1") int pageNow,
@RequestParam(value = "pageSize",defaultValue = "3") int pageSize){
return orderInfoService.getOrderInfoList(pageNow,pageSize);
}
}2. 創(chuàng)建Service層
package com.ithuang.demo.service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.mapper.OrderInfoMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class OrderInfoService {
@Resource
private OrderInfoMapper orderInfoMapper;
public List<OrderInfo> getOrderInfoList(int pageNow, int pageSize) {
PageHelper.startPage(pageNow,pageSize);
List<OrderInfo> orderInfoList = orderInfoMapper.getOrderInfoList();
PageInfo<OrderInfo> userPageInfo = new PageInfo<>(orderInfoList);
return userPageInfo.getList();
}
}3. 創(chuàng)建Mapper層
package com.ithuang.demo.mapper;
import com.ithuang.demo.bean.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface OrderInfoMapper {
List<OrderInfo> getOrderInfoList();
}5. 編寫xml文件
<?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.ithuang.demo.mapper.OrderInfoMapper">
<select id="getOrderInfoList" parameterType="int" resultType="com.ithuang.demo.bean.OrderInfo">
SELECT * FROM order_info
</select>
</mapper>6. 使用postman進行測試,測試結果如下

四、借助MyBatis提供的第三方PageHelper分頁插件2
1. 依賴pom.xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>2. 配置application.properties
#分頁插件 pagehelper.helper-dialect=mysql pagehelper.params=count=countSql pagehelper.reasonable=true pagehelper.support-methods-arguments=true
3. 實現分頁功能
①首頁超鏈接
<a th:href="@{/get/page/1}" rel="external nofollow" >顯示分頁數據</a>②controller方法
@RequestMapping("/get/page/{pageNo}")
public String getPage(
@PathVariable("pageNo") Integer pageNo,
Model model) {
// PageInfo 對象封裝了和分頁相關的所有信息
PageInfo<Emp> pageInfo = empService.getPageInfo(pageNo);
// 將 PageInfo 對象存入模型
model.addAttribute("pageInfo", pageInfo);
return "emp-page";
}③service 方法
@Override
public PageInfo<Emp> getPageInfo(Integer pageNo) {
// 1、確定每頁顯示數據的條數
int pageSize = 5;
// 2、設定分頁數據:開啟分頁功能。開啟后,后面執(zhí)行的 SELECT 語句會自動被附加 LIMIT 子句,
// 而且會自動查詢總記錄數
PageHelper.startPage(pageNo, pageSize);
// 3、正常執(zhí)行查詢
List<Emp> empList = empMapper.selectAll();
// 4、封裝為 PageInfo 對象返回
return new PageInfo<>(empList);
}④頁面展示
<tr>
<td colspan="5">
<span th:each="targetNum : ${pageInfo.navigatepageNums}">
<!-- 不是當前頁顯示為超鏈接 -->
<a th:if="${targetNum != pageInfo.pageNum}"
th:href="@{/employee/page/}+${targetNum}" rel="external nofollow"
th:text="'['+${targetNum}+']'">目標頁面的頁碼</a>
<!-- 是當前頁不需要顯示為超鏈接 -->
<span th:if="${targetNum == pageInfo.pageNum}" th:text="'['+${targetNum}+']'">當前頁頁碼</span>
</span>
</td>
</tr>
<tr>
<td colspan="5">
<span th:if="${pageInfo.hasPreviousPage}">
<a th:href="@{/employee/page/1}" rel="external nofollow" >首頁</a>
<a th:href="@{/employee/page/}+${pageInfo.prePage}" rel="external nofollow" >上一頁</a>
</span>
[[${pageInfo.pageNum}]]/[[${pageInfo.pages}]]
[[${pageInfo.pageNum}+'/'+${pageInfo.pages}]]
<span th:if="${pageInfo.hasNextPage}">
<a th:href="@{/employee/page/}+${pageInfo.nextPage}" rel="external nofollow" >下一頁</a>
<a th:href="@{/employee/page/}+${pageInfo.pages}" rel="external nofollow" >末頁</a>
</span>
</td>
</tr>
<tr>
<td colspan="5">
<!-- 綁定值改變事件響應函數 -->
<input id="jumpToPageNumInput" type="text" name="jumpToPageNum" placeholder="請輸入您想直接跳轉的頁碼" />
</td>
</tr>五、借助MyBatis-Plus攔截器進行分頁查詢
1. 項目整體結構

2. 編寫主配置類
package com.ithuang.demo.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}3. 創(chuàng)建controller層
package com.ithuang.demo.controller;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.service.OrderInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class OrderInfoController {
@Resource
private OrderInfoService orderInfoService;
@GetMapping("/getOrderInfoList")
public List<OrderInfo> getOrderInfoList(@RequestParam(value = "pageNow",defaultValue = "1") int pageNow,
@RequestParam(value = "pageSize",defaultValue = "3") int pageSize){
return orderInfoService.getOrderInfoList(pageNow,pageSize);
}
}4. 創(chuàng)建Service層
package com.ithuang.demo.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.mapper.OrderInfoMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class OrderInfoService {
@Resource
private OrderInfoMapper orderInfoMapper;
public List<OrderInfo> getOrderInfoList(int pageNow, int pageSize) {
Page<OrderInfo> page= new Page<>(pageNow,pageSize);
IPage<OrderInfo> iPage = orderInfoMapper.selectPage(page,null);
return iPage.getRecords();
}
}5. 創(chuàng)建Mapper層
package com.ithuang.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ithuang.demo.bean.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OrderInfoMapper extends BaseMapper<OrderInfo> {
}6. 使用postman進行測試,測試結果如下

六、借助MyBabtis提供的RowBounds進行分頁查詢
RowBounds它是在SQL執(zhí)行的結果進行截取分頁的,所以不適合大量數據的截取和分頁,它適合在查詢較少的結果集當中使用。
1. 項目整體結構

2. 創(chuàng)建controller層
package com.ithuang.demo.controller;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.service.OrderInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class OrderInfoController {
@Resource
private OrderInfoService orderInfoService;
@GetMapping("/getOrderInfoList")
public List<OrderInfo> getOrderInfoList(@RequestParam(value = "pageNow",defaultValue = "1") int pageNow,
@RequestParam(value = "pageSize",defaultValue = "3") int pageSize){
return orderInfoService.getOrderInfoList(pageNow,pageSize);
}
}3. 創(chuàng)建Service層
package com.ithuang.demo.service;
import com.ithuang.demo.bean.OrderInfo;
import com.ithuang.demo.mapper.OrderInfoMapper;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class OrderInfoService {
@Resource
private OrderInfoMapper orderInfoMapper;
public List<OrderInfo> getOrderInfoList(int pageNow, int pageSize) {
RowBounds rowBounds = new RowBounds(pageNow,pageSize);
return orderInfoMapper.getOrderInfoList(rowBounds);
}
}4. 創(chuàng)建Mapper層
package com.ithuang.demo.mapper;
import com.ithuang.demo.bean.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.RowBounds;
import java.util.List;
@Mapper
public interface OrderInfoMapper {
List<OrderInfo> getOrderInfoList(RowBounds rowBounds);
}5. 創(chuàng)建xml文件
<?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.ithuang.demo.mapper.OrderInfoMapper">
<select id="getOrderInfoList" resultType="com.ithuang.demo.bean.OrderInfo">
SELECT * FROM order_info
</select>
</mapper>6. 使用postman進行測試,測試結果如下

以上就是SpringBoot整合MyBatis四種常用的分頁方式(詳細總結)的詳細內容,更多關于SpringBoot整合MyBatis的資料請關注腳本之家其它相關文章!
相關文章
Java使用ant.jar執(zhí)行SQL腳本文件的示例代碼
這篇文章主要介紹了Java使用ant.jar執(zhí)行SQL腳本文件,文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-02-02
谷歌二維碼引擎com.google.zxing二維碼生成與解析
這篇文章主要給大家介紹了關于谷歌二維碼引擎com.google.zxing二維碼生成與解析的相關資料,zxing是google開源的二維碼生成和解析工具,需要的朋友可以參考下2023-07-07
Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心
這篇文章主要為大家介紹了Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Google Kaptcha 框架實現登錄驗證碼功能(SSM 和 SpringBoot)
這篇文章主要介紹了Google Kaptcha 實現登錄驗證碼(SSM 和 SpringBoot)功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12

