Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)
1. 數(shù)據(jù)庫(kù)映射對(duì)象與視圖對(duì)象
筆者在開(kāi)發(fā)過(guò)程中在面向客戶(hù)端展示時(shí)都是使用二次封裝的視圖對(duì)象(VO)來(lái)進(jìn)行內(nèi)容展示.
package com.fod.fodapi.vo;
import lombok.Data;
/**
* 用戶(hù)視圖對(duì)象
* @author 86137
* @date 2021-09-26 15:03
*/
@Data
public class UrmUserInfoVO {
/**
* 用戶(hù)主鍵
*/
private Integer id;
/**
* 用戶(hù)賬號(hào)
*/
private String userNumber;
/**
* 用戶(hù)名稱(chēng)
*/
private String userName;
/**
* 用戶(hù)頭像
*/
private String userImage;
/**
* 用戶(hù)性別
*/
private Integer userSex;
/**
* 聯(lián)系方式
*/
private String userPhone;
/**
* 狀態(tài)
*/
private Integer status;
/*
* 用戶(hù)角色
* */
private String userRole;
}
2. 測(cè)試SQL
測(cè)試sql是在數(shù)據(jù)庫(kù)客戶(hù)端進(jìn)行數(shù)據(jù)測(cè)試時(shí)進(jìn)行編寫(xiě),確保在編寫(xiě)代碼時(shí)不會(huì)出現(xiàn)sql查詢(xún)錯(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 查詢(xún)參數(shù)封裝
查詢(xún)過(guò)程中部分參數(shù)是需要重復(fù)使用比如:當(dāng)前頁(yè),當(dāng)前頁(yè)的數(shù)量,篩選條件等等。同時(shí)也可以解決查詢(xún)參數(shù)過(guò)多導(dǎo)致接口層接收數(shù)據(jù)的代碼過(guò)多。
公共使用的字段封裝:(類(lèi)名: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)
特定功能查詢(xún)字段封裝:(類(lèi)名:UrmUserInfoSelect )
在使用公共字段的時(shí)候繼承一下即可
/**
* 用戶(hù)查詢(xún)條件
*/
@Data
public class UrmUserInfoSelect extends PublicSelect{
/**用戶(hù)賬號(hào)*/
private String userNumber;
/**用戶(hù)名稱(chēng)*/
private String userName;
/**用戶(hù)性別*/
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è)類(lèi)里面將編寫(xiě)所有與業(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類(lèi)里面的一個(gè)放置查詢(xún)結(jié)果的參數(shù)
voPage.setRecords(
urmUserInfoMapper.selectiveUserInfoByOnlineStatus(voPage,voQueryWrapper));
return ResponseUtil.ok(voPage);
}
3.5 Mapper數(shù)據(jù)持久層
在mypper層編寫(xiě)sql時(shí):在方法里面的條件參數(shù)中必須加上**@Param(Constants.WRAPPER),在Sql末尾必須加上${ew.customSqlSegment}**否在定義的條件無(wú)效。由于篩選條件(查詢(xún)條件)在條件參數(shù)中已經(jīng)配置完成,在mapper的sql里面就不需要再次寫(xiě)入。
@Mapper
@Repository
public interface UrmUserInfoMapper extends BaseMapper<UrmUserInfo> {
// 出現(xiàn)的+為回車(chē)換行
@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)查詢(xú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ù)類(lèi)型為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 Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn),文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
SpringBoot項(xiàng)目部署時(shí)application.yml文件的加載優(yōu)先級(jí)和啟動(dòng)腳本問(wèn)題
Spring Boot在啟動(dòng)時(shí)會(huì)根據(jù)一定的優(yōu)先級(jí)順序加載配置文件,優(yōu)先級(jí)從高到低依次是:命令行參數(shù)、Jar包外部config目錄下的配置文件、Jar包同級(jí)目錄下的配置文件、classpath下的/config目錄、classpath根路徑2024-09-09
Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了Java swing實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計(jì)算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下2017-12-12
Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)
這篇文章主要介紹了Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例),需要的朋友可以參考下2017-09-09
全網(wǎng)最深分析SpringBoot MVC自動(dòng)配置失效的原因
這篇文章主要介紹了全網(wǎng)最深分析SpringBoot MVC自動(dòng)配置失效的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問(wèn)題解決方法
最近在做項(xiàng)目的時(shí)候,需要修改一個(gè)數(shù)組里面各個(gè)元素的值,foreach循環(huán)迭代數(shù)組元素時(shí),不能改變數(shù)組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數(shù)據(jù)的值的問(wèn)題及解決方法,感興趣的朋友一起看看吧2024-02-02
Eclipse maven項(xiàng)目lombok安裝配置圖解
這篇文章主要介紹了Eclipse maven項(xiàng)目lombok安裝配置圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

