Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)
1. 數(shù)據(jù)庫(kù)映射對(duì)象與視圖對(duì)象
筆者在開發(fā)過(guò)程中在面向客戶端展示時(shí)都是使用二次封裝的視圖對(duì)象(VO)來(lái)進(jìn)行內(nèi)容展示.
package com.fod.fodapi.vo;
import lombok.Data;
/**
* 用戶視圖對(duì)象
* @author 86137
* @date 2021-09-26 15:03
*/
@Data
public class UrmUserInfoVO {
/**
* 用戶主鍵
*/
private Integer id;
/**
* 用戶賬號(hào)
*/
private String userNumber;
/**
* 用戶名稱
*/
private String userName;
/**
* 用戶頭像
*/
private String userImage;
/**
* 用戶性別
*/
private Integer userSex;
/**
* 聯(lián)系方式
*/
private String userPhone;
/**
* 狀態(tài)
*/
private Integer status;
/*
* 用戶角色
* */
private String userRole;
}
2. 測(cè)試SQL
測(cè)試sql是在數(shù)據(jù)庫(kù)客戶端進(jìn)行數(shù)據(jù)測(cè)試時(shí)進(jìn)行編寫,確保在編寫代碼時(shí)不會(huì)出現(xiàn)sql查詢錯(cuò)誤
SELECT users.id, users.user_number, users.user_name, users.user_image, users.user_sex, users.user_phone, users.native_place, users.status, roles.role_name FROM urm_user_info AS users JOIN urm_user_online AS onlines ON users.id = onlines.user_info JOIN urm_user_role_relevance AS userAndRole ON users.id = userAndRole.user_id LEFT JOIN urm_role_info AS roles ON userAndRole.role_id = roles.id WHERE users.STATUS = 1 AND users.deleted = 0 AND onlines.online_status = 1 ORDER BY users.add_time
測(cè)試結(jié)果:

3. MVC層分解
3.1 查詢參數(shù)封裝
查詢過(guò)程中部分參數(shù)是需要重復(fù)使用比如:當(dāng)前頁(yè),當(dāng)前頁(yè)的數(shù)量,篩選條件等等。同時(shí)也可以解決查詢參數(shù)過(guò)多導(dǎo)致接口層接收數(shù)據(jù)的代碼過(guò)多。
公共使用的字段封裝:(類名:PublicSelect)
private Integer page = 1; //第幾頁(yè) private Integer limit = 10; // 每頁(yè)多少條數(shù)據(jù) private String sort = "add_time"; // 排序字段 private Boolean order = true; // 排序方式(true:asc,false:desc)
特定功能查詢字段封裝:(類名:UrmUserInfoSelect )
在使用公共字段的時(shí)候繼承一下即可
/**
* 用戶查詢條件
*/
@Data
public class UrmUserInfoSelect extends PublicSelect{
/**用戶賬號(hào)*/
private String userNumber;
/**用戶名稱*/
private String userName;
/**用戶性別*/
private Integer userSex;
/**聯(lián)系方式*/
private String userPhone;
/** 狀態(tài)*/
private Integer status;
/**新增時(shí)間*/
private Date addTime;
}
3.2 Controller層代碼
筆者在controller層只用做數(shù)據(jù)接收,數(shù)據(jù)的基本過(guò)濾驗(yàn)證,以及返回操作,業(yè)務(wù)全部在接口實(shí)現(xiàn)層里面(serverImpl)
@ApiOperation(value = "人員在線列表")
@GetMapping("/list")
@ResponseBody
public Object listSelective(@RequestBody UrmUserInfoSelect select){
return rdmPersonOnlineService.listSelective(select);
}
3.3 Service接口層
public interface RdmPersonOnlineService {
Object listSelective(UrmUserInfoSelect select);
}
3.4 ServiceImpl接口實(shí)現(xiàn)層
在這個(gè)類里面將編寫所有與業(yè)務(wù)有關(guān)的內(nèi)容
@Override
public Object listSelective(UrmUserInfoSelect select) {
// QueryWrapper用于構(gòu)建sql的過(guò)濾數(shù)據(jù)條件內(nèi)容,詳細(xì)看Mybatis-Plus官方文檔即可
QueryWrapper<UrmUserInfoVO> voQueryWrapper = new QueryWrapper<>();
voQueryWrapper.eq("users.status",STATUS_START);
voQueryWrapper.eq("users.deleted",DELETED_NO);
voQueryWrapper.eq("onlines.online_status",USER_ONLINE);
voQueryWrapper.orderBy(true, select.getOrder(), select.getSort());
// 構(gòu)建分頁(yè)條件,通過(guò)Page自動(dòng)進(jìn)行分頁(yè)操作
Page<UrmUserInfoVO> voPage = new Page<>(select.getPage(),select.getLimit());
// setRecords是Page類里面的一個(gè)放置查詢結(jié)果的參數(shù)
voPage.setRecords(
urmUserInfoMapper.selectiveUserInfoByOnlineStatus(voPage,voQueryWrapper));
return ResponseUtil.ok(voPage);
}
3.5 Mapper數(shù)據(jù)持久層
在mypper層編寫sql時(shí):在方法里面的條件參數(shù)中必須加上**@Param(Constants.WRAPPER),在Sql末尾必須加上${ew.customSqlSegment}**否在定義的條件無(wú)效。由于篩選條件(查詢條件)在條件參數(shù)中已經(jīng)配置完成,在mapper的sql里面就不需要再次寫入。
@Mapper
@Repository
public interface UrmUserInfoMapper extends BaseMapper<UrmUserInfo> {
// 出現(xiàn)的+為回車換行
@Select("SELECT " +
"users.id, users.user_number, users.user_name, users.user_image, users.user_sex, users.user_phone, users.native_place, users.status, roles.role_name " +
"FROM " +
"urm_user_info AS users " +
"JOIN urm_user_online AS onlines ON users.id = onlines.user_info " +
"JOIN urm_user_role_relevance AS userAndRole ON users.id = userAndRole.user_id " +
"LEFT JOIN urm_role_info AS roles ON userAndRole.role_id = roles.id ${ew.customSqlSegment}")
List<UrmUserInfoVO> selectiveUserInfoByOnlineStatus(Page<UrmUserInfoVO> voPage, @Param(Constants.WRAPPER)QueryWrapper<UrmUserInfoVO> voQueryWrapper);
}
4. 結(jié)果
篩選條件
{
"page":1,
"limit":5,
"sort": null,
"order":true,
"userNumber":null,
"userName":null,
"userSex": null,
"userPhone": null,
"status": null,
"addTime":null
}
篩選結(jié)果:
{
"errno": 0,
"data": {
"records": [
{
"id": 1,
"userNumber": "admin",
"userName": "admin",
"userImage": null,
"userSex": 1,
"userPhone": "1234567890123",
"status": 1,
"userRole": null,
"userOrganize": null
},
{
"id": 2,
"userNumber": "123456",
"userName": "張三",
"userImage": null,
"userSex": 0,
"userPhone": "1234567890123",
"status": 1,
"userRole": null,
"userOrganize": null
},
{
"id": 3,
"userNumber": "123456789",
"userName": "李四",
"userImage": null,
"userSex": 1,
"userPhone": "1234567890123",
"status": 1,
"userRole": null,
"userOrganize": null
},
{
"id": 4,
"userNumber": "123123",
"userName": "王五",
"userImage": null,
"userSex": 1,
"userPhone": "1234567890123",
"status": 1,
"userRole": null,
"userOrganize": null
},
{
"id": 5,
"userNumber": "12121212",
"userName": "馬六",
"userImage": null,
"userSex": 1,
"userPhone": "1234567890123",
"status": 1,
"userRole": null,
"userOrganize": null
}
],
"total": 6,
"size": 5,
"current": 1,
"orders": [],
"optimizeCountSql": true,
"hitCount": false,
"countId": null,
"maxLimit": null,
"searchCount": true,
"pages": 2
},
"errmsg": "成功"
}
圖示:

5 補(bǔ)充
5.1 分頁(yè)失效問(wèn)題
分頁(yè)時(shí)出現(xiàn)查詢出來(lái)的都是所有數(shù)據(jù),并不會(huì)進(jìn)行分頁(yè)。原因是mybatis-plus配置出現(xiàn)問(wèn)題。
不同版本可能會(huì)出現(xiàn)配置差異(筆者使用的是3.4.1)
@Configuration(proxyBeanMethods = false)
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor()
{
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分頁(yè)插件
interceptor.addInnerInterceptor(paginationInterceptor());
return interceptor;
}
/**
* 分頁(yè)插件
*/
public PaginationInnerInterceptor paginationInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 設(shè)置數(shù)據(jù)庫(kù)類型為mysql
paginationInnerInterceptor.setDbType(DbType.MYSQL);
// 設(shè)置請(qǐng)求的頁(yè)面大于最大頁(yè)后操作, true調(diào)回到首頁(yè),false 繼續(xù)請(qǐng)求 默認(rèn)false
paginationInnerInterceptor.setOverflow(false);
// 設(shè)置最大單頁(yè)限制數(shù)量,默認(rèn) 500 條,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}
}
到此這篇關(guān)于Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatisplus多條件篩選分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring整合Mybatis具體代碼實(shí)現(xiàn)流程
這篇文章主要介紹了Spring整合Mybatis實(shí)操分享,文章首先通過(guò)介紹Mybatis的工作原理展開Spring整合Mybatis的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05
SpringBoot啟動(dòng)執(zhí)行sql腳本的3種方法實(shí)例
在應(yīng)用程序啟動(dòng)后,可以自動(dòng)執(zhí)行建庫(kù)、建表等SQL腳本,下面這篇文章主要給大家介紹了關(guān)于SpringBoot啟動(dòng)執(zhí)行sql腳本的3種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
java中Timer定時(shí)器的使用和啟動(dòng)方式
這篇文章主要介紹了java中Timer定時(shí)器的使用和啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring Boot Web應(yīng)用開發(fā) CORS 跨域請(qǐng)求支持
本篇文章主要介紹了Spring Boot Web應(yīng)用開發(fā) CORS 跨域請(qǐng)求支持,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

