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ù)使用比如:當前頁,當前頁的數(shù)量,篩選條件等等。同時也可以解決查詢參數(shù)過多導致接口層接收數(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)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_19331985/article/details/120496441