Mybatis-plus如何实现多条件筛选分页
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍Mybatis-plus如何实现多条件筛选分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 数据库映射对象与视图对象在开发过程中在面向客户端展示时都是使用
千家信息网最后更新 2025年01月31日Mybatis-plus如何实现多条件筛选分页
这篇文章主要介绍Mybatis-plus如何实现多条件筛选分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1. 数据库映射对象与视图对象
在开发过程中在面向客户端展示时都是使用二次封装的视图对象(VO)来进行内容展示.
package com.fod.fodapi.vo;import lombok.Data;/** * 用户视图对象 * @author 86137 * @date 2021-09-26 15:03 */@Datapublic 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;}
2. 测试SQL
测试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_nameFROM 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 = 1ORDER BY users.add_time
测试结果:
3. MVC层分解
3.1 查询参数封装
查询过程中部分参数是需要重复使用比如:当前页,当前页的数量,筛选条件等等。同时也可以解决查询参数过多导致接口层接收数据的代码过多。
公共使用的字段封装:(类名:PublicSelect)
private Integer page = 1; //第几页 private Integer limit = 10; // 每页多少条数据 private String sort = "add_time"; // 排序字段 private Boolean order = true; // 排序方式(true:asc,false:desc)
特定功能查询字段封装:(类名:UrmUserInfoSelect )
在使用公共字段的时候继承一下即可
/** * 用户查询条件 */@Datapublic class UrmUserInfoSelect extends PublicSelect{ /**用户账号*/ private String userNumber; /**用户名称*/ private String userName; /**用户性别*/ private Integer userSex; /**联系方式*/ private String userPhone; /** 状态*/ private Integer status; /**新增时间*/ private Date addTime;}
3.2 Controller层代码
笔者在controller层只用做数据接收,数据的基本过滤验证,以及返回操作,业务全部在接口实现层里面(serverImpl)
@ApiOperation(value = "人员在线列表")@GetMapping("/list")@ResponseBodypublic Object listSelective(@RequestBody UrmUserInfoSelect select){ return rdmPersonOnlineService.listSelective(select);}
3.3 Service接口层
public interface RdmPersonOnlineService { Object listSelective(UrmUserInfoSelect select);}
3.4 ServiceImpl接口实现层
在这个类里面将编写所有与业务有关的内容
@Overridepublic Object listSelective(UrmUserInfoSelect select) { // QueryWrapper用于构建sql的过滤数据条件内容,详细看Mybatis-Plus官方文档即可 QueryWrappervoQueryWrapper = 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 voPage = new Page<>(select.getPage(),select.getLimit()); // setRecords是Page类里面的一个放置查询结果的参数 voPage.setRecords( urmUserInfoMapper.selectiveUserInfoByOnlineStatus(voPage,voQueryWrapper)); return ResponseUtil.ok(voPage);}
3.5 Mapper数据持久层
在mypper层编写sql时:在方法里面的条件参数中必须加上**@Param(Constants.WRAPPER),在Sql末尾必须加上${ew.customSqlSegment}**否在定义的条件无效。由于筛选条件(查询条件)在条件参数中已经配置完成,在mapper的sql里面就不需要再次写入。
@Mapper@Repositorypublic interface UrmUserInfoMapper extends BaseMapper{ // 出现的+为回车换行 @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 selectiveUserInfoByOnlineStatus(Page voPage, @Param(Constants.WRAPPER)QueryWrapper voQueryWrapper);}
4. 结果
筛选条件
{ "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": "成功"}
图示:
5 补充
5.1 分页失效问题
分页时出现查询出来的都是所有数据,并不会进行分页。原因是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如何实现多条件筛选分页"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
条件
数据
用户
查询
参数
内容
字段
对象
接口
结果
封装
测试
代码
数据库
方式
视图
配置
最大
业务
名称
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全对密码的描述正确的是
mpp数据库是内存型数据库吗
软件开发公司怎么运作的
网络技术习题2
服务器 销售
网络技术应用教学目录
定期开展网络安全应急演练
iphone倒数据库
北斗导航与网络安全
数据库系统的安全性质
数据库开发技术教案
计算机软件开发的过程
axure 服务器素材
网络安全以后就业怎么样
两会委员建言网络安全与人工智能
如何设置数据库数字格式
网络安全应急工程师
服务器有必要插网线吗
对网络安全防护的理解
查看服务器硬盘类型
学生管理系统数据库
简幻欢服务器为什么不能设管理员
成都黑闪网络技术公司
cc服务器编程是干什么的
怎么把数据库传到远程服务器
吉林鲲鹏服务器企业
服务器控制器
券商软件开发
深圳互联网软件开发哪家可靠
软件开发国内国外