这篇文章主要介绍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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。