Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集
一、MyBatisPlusConfig中配置分頁插件
/**
* 配置分頁插件
* @return page
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 開啟 count 的 join 優(yōu)化,只針對部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}1. 分頁實現(xiàn)的原理
Mybatis-plus分頁插件使用的是IPage進行分頁。IPage內(nèi)部原理是基于攔截器,攔截的是方法以及方法中的參數(shù)。判斷是否是查詢操作,如果是查詢操作,才會進入分頁的處理邏輯。 進入分頁邏輯處理后,攔截器會通過反射獲取該方法的參數(shù)進行判斷是否存在IPage對象的實現(xiàn)類。如果不存在則不進行分頁,存在則將該參數(shù)賦值給IPage對象,然后進行拼接sql的處理完成分頁操作。

二、統(tǒng)一結(jié)果集
1. 創(chuàng)建返回碼定義類
public class ResultCode {
/**
* 成功
**/
public final static int OK = 20000;
/**
* 失敗
**/
public final static int ERROR = 20001;
/**
* 用戶名或密碼錯誤
**/
public final static int LOGIN_ERROR = 20002;
/**
* 權(quán)限不足
**/
public final static int ACCESS_ERROR = 20003;
/**
* 遠程調(diào)用失敗
**/
public final static int REMOTE_ERROR = 20004;
/**
* 重復(fù)操作
**/
public final static int REPEAT_ERROR = 20005;
}2. 創(chuàng)建結(jié)果集類
@Data
@ApiModel(value = "全局統(tǒng)一返回結(jié)果")
public class R implements Serializable {
public final static String OK_MSG = "請求成功";
public final static String FAIL_MSG = "請求失敗";
@ApiModelProperty(value = "是否成功")
private boolean success;
@ApiModelProperty(value = "返回碼")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回數(shù)據(jù)")
private Object data;
@ApiModelProperty(value = "總條數(shù)")
private Long total;
@ApiModelProperty(value = "分頁信息")
private PageInfo pageInfo;
@Data
public static class PageInfo {
@ApiModelProperty("當前頁")
protected int currentPage;
@ApiModelProperty("頁大小")
protected int pageSize;
@ApiModelProperty("總記錄數(shù)")
protected long totalCount;
@ApiModelProperty("總頁數(shù)")
protected long totalPage;
public PageInfo() {
}
@ConstructorProperties({"currentPage", "pageSize", "totalCount", "totalPage"})
public PageInfo(int currentPage, int pageSize, long totalCount, long totalPage) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.totalPage = totalPage;
}
}
private R(){}
private R(int code, String msg, Object data) {
this.code = code;
this.message = msg;
if (data instanceof Page<?>) {
Page<?> page = (Page<?>) data;
this.total = page.getTotal();
this.data = page.getRecords();
this.pageInfo = new PageInfo((int)page.getCurrent(), (int)page.getSize(), page.getTotal(), page.getPages());
} else {
this.data = data;
}
}
public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.OK);
r.setMessage("成功");
return r;
}
public static R ok(Object data) {
return new R(ResultCode.OK, OK_MSG, data);
}
public static R ok(String msg, Object data) {
return new R(ResultCode.OK, msg, data);
}
public static R error(){
R r = new R();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("失敗");
return r;
}
public static R error(String msg) {
return new R(ResultCode.ERROR, msg, null);
}
public static R error(int errorCode, String msg) {
return new R(errorCode, msg, null);
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(Object data){
this.setData(data);
return this;
}
}
復(fù)制代碼三、編寫分頁接口
1. 先編寫查詢類
代碼如下:
@Data
public class MemberQueryVo extends BasePageEntity{
@ApiModelProperty(value = "用戶名")
private String userName;
}2. service層
先定義一個查詢分頁的接口,在實現(xiàn)類里做相關(guān)處理
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
@Override
public IPage<Member> listMemberPage(MemberQueryVo queryVo) {
IPage<Member> page = new Page<>(queryVo.getCurrentPage(),queryVo.getCurrentPage());
//條件查詢
LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<Member>();
if (StringUtils.isNotBlank(queryVo.getUserName())) {
queryWrapper.like(Member::getUserName, queryVo.getUserName());
}
return baseMapper.selectPage(page,queryWrapper);
}
}3. controller層
編寫分頁接口,代碼如下:
@ApiOperation(value = "分頁用戶列表")
@GetMapping(value = "/getPage")
public R listPage(MemberQueryVo queryVo){
IPage<Member> page = memberService.listMemberPage(queryVo);
return R.ok(page);
}4. 接口測試
直接通過swagger生成的api接口頁面進行測試,當前頁、每頁參數(shù)傳1時,返回的分頁信息里,總數(shù)是兩條,只返回了一條數(shù)據(jù)。說明分頁成功。
再進行條件查詢的時候,也成功查詢對應(yīng)數(shù)據(jù)。

再進行條件查詢的時候,也成功查詢對應(yīng)數(shù)據(jù)。

總結(jié)
感謝大家的閱讀,上就是今天要講的內(nèi)容,本文簡單介紹了如何配置分頁插件、以及分頁的原理。如有不足之處,純屬能力有限,還請多多包涵。
到此這篇關(guān)于Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集的文章就介紹到這了,更多相關(guān)Mybatis-plus分頁返回統(tǒng)一結(jié)果集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項目注入?traceId?追蹤整個請求的日志鏈路(過程詳解)
本文介紹了如何在單體SpringBoot項目中通過手動實現(xiàn)過濾器或攔截器來注入traceId,以追蹤整個請求的日志鏈路,通過使用MDC和配置日志格式,可以在日志中包含traceId,便于問題排查,同時,還在返回的包裝類中注入traceId,以便用戶反饋問題,感興趣的朋友一起看看吧2025-02-02
MyBatis-Plus與Druid結(jié)合Dynamic-datasource實現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫的示例
Dynamic-DataSource 可以和絕大多是連接層插件搭配使用,比如:mybatis,mybatis-plus,hibernate等,本文就來介紹一下MyBatis-Plus與Druid結(jié)合Dynamic-datasource實現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫的示例,感興趣的可以了解一下2023-10-10
Spring boot項目中異常攔截設(shè)計和處理詳解
這篇文章主要介給大家紹了關(guān)于Spring boot項目中異常攔截設(shè)計和處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧2018-12-12
關(guān)于java String中intern的深入講解
這篇文章主要給大家介紹了關(guān)于java String中intern的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
MyBatis之foreach標簽的用法及多種循環(huán)問題
這篇文章主要介紹了MyBatis之foreach標簽的用法及多種循環(huán)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Springboot如何使用logback實現(xiàn)多環(huán)境配置?
上一篇文章中老顧介紹了logback基本配置,了解了日志配置的基本方式.我們平時在系統(tǒng)開發(fā)時,開發(fā)環(huán)境與生產(chǎn)環(huán)境的日志配置會不一樣;那今天老顧就跟大家介紹一下如何實現(xiàn)多環(huán)境配置,需要的朋友可以參考下2021-06-06
springboot logback調(diào)整mybatis日志級別無效的解決
這篇文章主要介紹了springboot logback調(diào)整mybatis日志級別無效的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java四舍五入時保留指定小數(shù)位數(shù)的五種方式
這篇文章主要介紹了Java四舍五入時保留指定小數(shù)位數(shù)的五種方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-09-09

