Mybatis-plus多条件筛选分页的实现
程序员文章站
2022-03-12 11:29:18
目录2. 测试sql3. mvc层分解3.2 controller层代码3.3 service接口层3.4 serviceimpl接口实现层3.5 mapper数据持久层1. 数据库映射对象与视图对象...
1. 数据库映射对象与视图对象
笔者在开发过程中在面向客户端展示时都是使用二次封装的视图对象(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; }
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_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
测试结果:
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 )
在使用公共字段的时候继承一下即可
/** * 用户查询条件 */ @data public 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") @responsebody public object listselective(@requestbody urmuserinfoselect select){ return rdmpersononlineservice.listselective(select); }
3.3 service接口层
public interface rdmpersononlineservice { object listselective(urmuserinfoselect select); }
3.4 serviceimpl接口实现层
在这个类里面将编写所有与业务有关的内容
@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); }
3.5 mapper数据持久层
在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); }
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多条件筛选分页的实现的文章就介绍到这了,更多相关mybatisplus多条件筛选分页内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
-
Django 标签筛选的实现代码(一对多、多对多)
-
利用PHP访问数据库_实现分页功能与多条件查询功能的示例
-
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
-
day02_品优购电商项目_02_前端框架AngularJS入门 + 品牌列表的实现 + 品牌列表分页的实现 + 增加/修改/删除品牌的实现 + 品牌分页条件查询的实现_用心笔记
-
.net Core学习笔记2 实现列表的条件筛选,排序,分页
-
Mybatis-plus多条件筛选分页的实现
-
vuejs实现本地数据的筛选分页功能思路详解
-
mybatis-plus QueryWrapper自定义查询条件的实现
-
Django 标签筛选的实现(一对多、多对多)