MyBatis 分頁插件 PageHelper的不同使用方式
前言
PageHelper 是 針對(duì) MyBatis 的一款分頁插件,它支持常見 Oracle、MySql、MariaDB、SQLite、DB2、PostgreSQL、SqlServer 等 12 種數(shù)據(jù)庫(kù)分頁,它支持常見的RowBounds(PageRowBounds)、PageHelper.startPage 方法調(diào)用、Mapper 接口參數(shù)調(diào)用等多種分頁方式。
一、依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>6.1.1</version>
<scope>compile</scope>
</dependency>二、分頁插件的不同使用方式
第一種(推薦)
//Mapper接口方式的調(diào)用,推薦這種使用方式。 PageHelper.startPage(1, 10); List<User> list = userMapper.selectIf(1);
注意:只有緊跟在PageHelper.startPage方法后的第一個(gè)Mybatis的查詢(Select)方法會(huì)被分頁。
第二種
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
第三種
PageHelper.offsetPage(0, 10); List<User> list = userMapper.selectIf(1);
第四種(參數(shù)方法調(diào)用)
//存在以下 Mapper 接口方法,你不需要在 xml 處理后兩個(gè)參數(shù)
public interface CountryMapper {
List<User> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代碼中直接調(diào)用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);第五種(參數(shù)對(duì)象)
/如果 pageNum 和 pageSize 存在于 User 對(duì)象中,只要參數(shù)有值,也會(huì)被分頁
//有如下 User 對(duì)象
public class User {
//其他fields
//下面兩個(gè)參數(shù)名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 處理后兩個(gè)參數(shù)
public interface CountryMapper {
List<User> selectByPageNumSize(User user);
}
//當(dāng) user 中的 pageNum!= null && pageSize!= null 時(shí),會(huì)自動(dòng)分頁
List<User> list = userMapper.selectByPageNumSize(user);三、重要提示
1.只有緊跟在PageHelper.startPage方法后的第一個(gè)Mybatis的查詢(Select)方法會(huì)被分頁。
2.不要配置多個(gè)分頁插件
不要在系統(tǒng)中配置多個(gè)分頁插件(使用Spring時(shí),mybatis-config.xml和Spring配置方式,請(qǐng)選擇其中一種,不要同時(shí)配置多個(gè)分頁插件)!
3.分頁插件不支持帶有for update語句的分頁
對(duì)于帶有for update的sql,會(huì)拋出運(yùn)行時(shí)異常,對(duì)于這樣的sql建議手動(dòng)分頁,畢竟這樣的sql需要重視。
4.分頁插件不支持嵌套結(jié)果映射
由于嵌套結(jié)果方式會(huì)導(dǎo)致結(jié)果集被折疊,因此分頁查詢的結(jié)果在折疊后總數(shù)會(huì)減少,所以無法保證分頁結(jié)果數(shù)量正確。
四、示例
示例一
Controller 層接口:
@PostMapping("/queryList")
public ResponseEntity<PageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
PageInfo<ReconcileOrderDto> pageInfo = new PageInfo<>(orderList);
return ResponseEntity.ok().body(pageInfo);
}
service 方法:
public List<ReconcileOrderDto> queryList(ReconcileOrderRequest request) {
ReconcileOrderPageDto orderPageDto = buildReconcileOrderPageDto(request);
//分頁查詢
PageHelper.startPage(request.getPage(), request.getPageSize());
List<ReconcileOrderDto> pageReconcile = operateOrderMapper.selectOrderByReconcileTime(orderPageDto);
return pageReconcile;
}
示例二
上面使用了 PageInfo ,除了使用 PageHelper 自帶的 PageInfo 分頁類,也可以自己定義分頁類。
import com.github.pagehelper.Page;
import lombok.ToString;
import java.util.List;
@ToString
public class MyPageInfo<T>{
/**
* 總條數(shù)
*/
private int total;
/**
* 條數(shù)
*/
private int size;
/**
* 每頁條數(shù)
*/
private int pageSize;
/**
* 當(dāng)前頁碼
*/
private int pageNum;
/**
* 分頁數(shù)據(jù)
*/
private List<T> list;
public MyPageInfo(String code, String message, int size, int pageSize, int pageNum, int total, List<T> data) {
super(code, message);
this.size = size;
this.pageSize = pageSize;
this.pageNum = pageNum;
this.list = data;
this.total = total;
}
public MyPageInfo(String code, String message, List<T> data) {
super(code, message);
this.list = data;
}
public MyPageInfo(List<T> data) {
this.list = data;
if (data instanceof Page) {
Page<T> page = (Page<T>) data;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.size = page.size();
this.total = (int) page.getTotal();
} else if (data != null) {
this.pageNum = 1;
this.pageSize = data.size();
this.size = data.size();
this.total = data.size();
}
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public Object getList() {
return list;
}
public void setList(List<T> data) {
this.list = data;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}上面的 自定義分頁類 MyPageInfo 含有 total、size等方法,你還可以增加其他字段,比如 sucess來標(biāo)識(shí)請(qǐng)求是否成功、errorMessage 錯(cuò)誤消息等。
使用 MyPageInfo 后,示例一的 代碼可以修改為:
@PostMapping("/queryList")
public ResponseEntity<MyPageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
MyPageInfo<ReconcileOrderDto> myPageInfo = new MyPageInfo<>(orderList);
return ResponseEntity.ok().body(myPageInfo );
}
到此這篇關(guān)于MyBatis 分頁插件 PageHelper的不同使用方式的文章就介紹到這了,更多相關(guān)MyBatis 分頁插件 PageHelper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis分頁插件Pagehelper不生效的原因及解決
- Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁(使用步驟)
- Springboot?Mybatis使用pageHelper如何實(shí)現(xiàn)分頁查詢
- Mybatis分頁插件Pagehelper的PageInfo字段屬性使用及解釋
- MyBatis中使用分頁插件PageHelper實(shí)現(xiàn)分頁功能
- 解決mybatis分頁插件PageHelper導(dǎo)致自定義攔截器失效
- Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對(duì)問題的解決方法
- springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能
- Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper)
相關(guān)文章
SpringCloudAlibaba整合服務(wù)網(wǎng)關(guān)GateWay教程
文章介紹了Spring Cloud Gateway和Zuul的區(qū)別,并詳細(xì)描述了如何使用Gateway進(jìn)行服務(wù)轉(zhuǎn)發(fā)和自定義TokenFilter實(shí)現(xiàn)參數(shù)攔截訪問2026-01-01
MyBatis中SqlSession實(shí)現(xiàn)增刪改查案例
這篇文章主要介紹了MyBatis中SqlSession實(shí)現(xiàn)增刪改查案例,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
Java如何實(shí)現(xiàn)CIDR轉(zhuǎn)IP段
CIDR是一種用于高效分配和管理?IP?地址的網(wǎng)絡(luò)編址方法,這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)CIDR轉(zhuǎn)IP段,感興趣的小伙伴可以參考一下2025-03-03
mybatis解決<foreach>標(biāo)簽不能超過1000的問題
MyBatis是一個(gè)開源的持久層框架,它可以幫助開發(fā)者簡(jiǎn)化數(shù)據(jù)庫(kù)操作的編寫,而foreach是MyBatis中的一個(gè)重要標(biāo)簽,用于在SQL語句中進(jìn)行循環(huán)操作,本文主要給大家介紹了mybatis解決<foreach>標(biāo)簽不能超過1000的問題,需要的朋友可以參考下2024-05-05
java圖片和文本同時(shí)提交到表單的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于java實(shí)現(xiàn)圖片和文本同時(shí)提交到表單的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-02-02

