Mybatis-plus多條件篩選分頁的實現(xiàn)
1. 數(shù)據(jù)庫映射對象與視圖對象
筆者在開發(fā)過程中在面向客戶端展示時都是使用二次封裝的視圖對象(VO)來進行內(nèi)容展示.
package com.fod.fodapi.vo;
import lombok.Data;
/**
* 用戶視圖對象
* @author 86137
* @date 2021-09-26 15:03
*/
@Data
public class UrmUserInfoVO {
/**
* 用戶主鍵
*/
private Integer id;
/**
* 用戶賬號
*/
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. 測試SQL
測試sql是在數(shù)據(jù)庫客戶端進行數(shù)據(jù)測試時進行編寫,確保在編寫代碼時不會出現(xiàn)sql查詢錯誤
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
測試結(jié)果:

3. MVC層分解
3.1 查詢參數(shù)封裝
查詢過程中部分參數(shù)是需要重復(fù)使用比如:當(dāng)前頁,當(dāng)前頁的數(shù)量,篩選條件等等。同時也可以解決查詢參數(shù)過多導(dǎo)致接口層接收數(shù)據(jù)的代碼過多。
公共使用的字段封裝:(類名:PublicSelect)
private Integer page = 1; //第幾頁 private Integer limit = 10; // 每頁多少條數(shù)據(jù) private String sort = "add_time"; // 排序字段 private Boolean order = true; // 排序方式(true:asc,false:desc)
特定功能查詢字段封裝:(類名:UrmUserInfoSelect )
在使用公共字段的時候繼承一下即可
/**
* 用戶查詢條件
*/
@Data
public class UrmUserInfoSelect extends PublicSelect{
/**用戶賬號*/
private String userNumber;
/**用戶名稱*/
private String userName;
/**用戶性別*/
private Integer userSex;
/**聯(lián)系方式*/
private String userPhone;
/** 狀態(tài)*/
private Integer status;
/**新增時間*/
private Date addTime;
}
3.2 Controller層代碼
筆者在controller層只用做數(shù)據(jù)接收,數(shù)據(jù)的基本過濾驗證,以及返回操作,業(yè)務(wù)全部在接口實現(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接口實現(xiàn)層
在這個類里面將編寫所有與業(yè)務(wù)有關(guān)的內(nèi)容
@Override
public Object listSelective(UrmUserInfoSelect select) {
// QueryWrapper用于構(gòu)建sql的過濾數(shù)據(jù)條件內(nèi)容,詳細看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)建分頁條件,通過Page自動進行分頁操作
Page<UrmUserInfoVO> voPage = new Page<>(select.getPage(),select.getLimit());
// setRecords是Page類里面的一個放置查詢結(jié)果的參數(shù)
voPage.setRecords(
urmUserInfoMapper.selectiveUserInfoByOnlineStatus(voPage,voQueryWrapper));
return ResponseUtil.ok(voPage);
}
3.5 Mapper數(shù)據(jù)持久層
在mypper層編寫sql時:在方法里面的條件參數(shù)中必須加上**@Param(Constants.WRAPPER),在Sql末尾必須加上${ew.customSqlSegment}**否在定義的條件無效。由于篩選條件(查詢條件)在條件參數(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 補充
5.1 分頁失效問題
分頁時出現(xiàn)查詢出來的都是所有數(shù)據(jù),并不會進行分頁。原因是mybatis-plus配置出現(xiàn)問題。
不同版本可能會出現(xiàn)配置差異(筆者使用的是3.4.1)
@Configuration(proxyBeanMethods = false)
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor()
{
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分頁插件
interceptor.addInnerInterceptor(paginationInterceptor());
return interceptor;
}
/**
* 分頁插件
*/
public PaginationInnerInterceptor paginationInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 設(shè)置數(shù)據(jù)庫類型為mysql
paginationInnerInterceptor.setDbType(DbType.MYSQL);
// 設(shè)置請求的頁面大于最大頁后操作, true調(diào)回到首頁,false 繼續(xù)請求 默認false
paginationInnerInterceptor.setOverflow(false);
// 設(shè)置最大單頁限制數(shù)量,默認 500 條,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}
}
到此這篇關(guān)于Mybatis-plus多條件篩選分頁的實現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatisplus多條件篩選分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot高級教程之使用Redis實現(xiàn)session共享
這篇文章主要為大家詳細介紹了Spring Boot高級教程之使用Redis實現(xiàn)session共享,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn),文中通過代碼示例講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
SpringBoot項目部署時application.yml文件的加載優(yōu)先級和啟動腳本問題
Spring Boot在啟動時會根據(jù)一定的優(yōu)先級順序加載配置文件,優(yōu)先級從高到低依次是:命令行參數(shù)、Jar包外部config目錄下的配置文件、Jar包同級目錄下的配置文件、classpath下的/config目錄、classpath根路徑2024-09-09
全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因
這篇文章主要介紹了全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問題解決方法
最近在做項目的時候,需要修改一個數(shù)組里面各個元素的值,foreach循環(huán)迭代數(shù)組元素時,不能改變數(shù)組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數(shù)據(jù)的值的問題及解決方法,感興趣的朋友一起看看吧2024-02-02

