您好,登錄后才能下訂單哦!
這篇文章主要介紹Mybatis-plus如何實現多條件篩選分頁,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在開發過程中在面向客戶端展示時都是使用二次封裝的視圖對象(VO)來進行內容展示.
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; /** * 聯系方式 */ private String userPhone; /** * 狀態 */ private Integer status; /* * 用戶角色 * */ private String userRole; }
測試sql是在數據庫客戶端進行數據測試時進行編寫,確保在編寫代碼時不會出現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
測試結果:
查詢過程中部分參數是需要重復使用比如:當前頁,當前頁的數量,篩選條件等等。同時也可以解決查詢參數過多導致接口層接收數據的代碼過多。
公共使用的字段封裝:(類名:PublicSelect)
private Integer page = 1; //第幾頁 private Integer limit = 10; // 每頁多少條數據 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; /**聯系方式*/ private String userPhone; /** 狀態*/ private Integer status; /**新增時間*/ private Date addTime; }
筆者在controller層只用做數據接收,數據的基本過濾驗證,以及返回操作,業務全部在接口實現層里面(serverImpl)
@ApiOperation(value = "人員在線列表") @GetMapping("/list") @ResponseBody public Object listSelective(@RequestBody UrmUserInfoSelect select){ return rdmPersonOnlineService.listSelective(select); }
public interface RdmPersonOnlineService { Object listSelective(UrmUserInfoSelect select); }
在這個類里面將編寫所有與業務有關的內容
@Override public Object listSelective(UrmUserInfoSelect select) { // QueryWrapper用于構建sql的過濾數據條件內容,詳細看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()); // 構建分頁條件,通過Page自動進行分頁操作 Page<UrmUserInfoVO> voPage = new Page<>(select.getPage(),select.getLimit()); // setRecords是Page類里面的一個放置查詢結果的參數 voPage.setRecords( urmUserInfoMapper.selectiveUserInfoByOnlineStatus(voPage,voQueryWrapper)); return ResponseUtil.ok(voPage); }
在mypper層編寫sql時:在方法里面的條件參數中必須加上**@Param(Constants.WRAPPER),在Sql末尾必須加上${ew.customSqlSegment}**否在定義的條件無效。由于篩選條件(查詢條件)在條件參數中已經配置完成,在mapper的sql里面就不需要再次寫入。
@Mapper @Repository public interface UrmUserInfoMapper extends BaseMapper<UrmUserInfo> { // 出現的+為回車換行 @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); }
篩選條件
{ "page":1, "limit":5, "sort": null, "order":true, "userNumber":null, "userName":null, "userSex": null, "userPhone": null, "status": null, "addTime":null }
篩選結果:
{ "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": "成功" }
圖示:
分頁時出現查詢出來的都是所有數據,并不會進行分頁。原因是mybatis-plus配置出現問題。
不同版本可能會出現配置差異(筆者使用的是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(); // 設置數據庫類型為mysql paginationInnerInterceptor.setDbType(DbType.MYSQL); // 設置請求的頁面大于最大頁后操作, true調回到首頁,false 繼續請求 默認false paginationInnerInterceptor.setOverflow(false); // 設置最大單頁限制數量,默認 500 條,-1 不受限制 paginationInnerInterceptor.setMaxLimit(-1L); return paginationInnerInterceptor; } }
以上是“Mybatis-plus如何實現多條件篩選分頁”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。