服务器 > 网络 > websocket

QueryWrapper中or的使用技巧分享

72人参与 2024-10-22 websocket

场景描述

假设我们正在开发一个邮件系统,系统中有一个名为 mailinfo 的表,用于存储邮件信息。该表有两个字段与用户相关:user_id 表示邮件的发送者,to_user_id 表示邮件的接收者。我们需要编写一个查询,找出当前用户(userid)所有与其相关的邮件,不论是他发送的,还是接收到的。此外,我们还要确保这些邮件未被删除,并且按更新时间进行排序。

需求拆解

根据上述需求,我们需要实现以下几点:

这些需求在 sql 中可以通过一个简单的 select 语句来实现,类似于:

select * from mailinfo
where is_delete = 0
and (user_id = ? or to_user_id = ?)
order by update_time desc;

但在 java 开发中,尤其是使用了 mybatis-plus 这样一个 orm 框架时,我们通常会使用 querywrapper 来构造查询条件,以提高代码的可读性和可维护性。

使用 mybatis-plus 构建查询条件

在 mybatis-plus 中,querywrapper 是一个非常强大的查询构造器,它可以通过流式 api 来动态地构造 sql 查询。在处理复杂查询条件时,例如 or 和 and 的组合,它也提供了相应的接口来满足需求。

下面我们来看一个具体的代码示例,展示如何通过 querywrapper 来构建我们的查询条件:

page<mailinfo> pageparm = new page<>();
pageparm.setcurrent(page);
pageparm.setsize(pagesize);
querywrapper<mailinfo> wrapper = new querywrapper<>();
wrapper.eq("is_delete", 0)  // 只查询未删除的邮件
       .and(w -> w.eq("user_id", userid).or().eq("to_user_id", userid))  // 查询当前用户发送或接收的邮件
       .orderbydesc("update_time");  // 按更新时间降序排序

return result.ok(mailinfodto.converter.instance.from(this.mailinfoservice.page(pageparm, wrapper)));

代码解析

1. 分页参数

page<mailinfo> pageparm = new page<>();
pageparm.setcurrent(page);
pageparm.setsize(pagesize);

在大多数业务场景中,我们会对查询结果进行分页处理,以避免一次性返回过多数据,影响性能。mybatis-plus 提供了 page 类来处理分页逻辑。在这段代码中,我们通过 setcurrent 方法设置当前页数,并通过 setsize 设置每页返回的记录数量。

2. 构造查询条件

querywrapper<mailinfo> wrapper = new querywrapper<>();
wrapper.eq("is_delete", 0)
       .and(w -> w.eq("user_id", userid).or().eq("to_user_id", userid));

这里的 querywrapper 是 mybatis-plus 提供的查询构造器,允许我们通过流式的方式来构造查询条件。

3. 排序条件

wrapper.orderbydesc("update_time");

这行代码用于指定排序条件。我们希望按邮件的更新时间从新到旧进行排序,因此使用了 orderbydesc 方法,并将 update_time 作为排序字段。

结果封装

在实际的开发过程中,我们通常会将查询结果封装为一个统一的返回结构。在这个例子中,我们将查询结果封装为 result.ok,并通过 mailinfodto.converter.instance 进行数据转换,将数据库实体类 mailinfo 转换为 mailinfodto。

querywrapper 的 or 使用技巧

在使用 querywrapper 构建查询时,or 方法是一个非常有用的工具。它允许我们在查询中添加多个可能的条件,从而使查询结果更加灵活。在本文的例子中,我们使用了 or 来查询 user_id 或 to_user_id 等于 userid 的记录,从而满足了业务需求。

但是,使用 or 也需要小心,因为它可能会影响查询的性能。在涉及大量数据时,or 条件的查询速度可能会较慢。为此,我们可以考虑以下优化策略:

  1. 创建索引:确保 user_id 和 to_user_id 字段上创建了索引,这样可以大幅提高查询速度。
  2. 使用缓存:在高频率访问的场景下,适当地使用缓存可以减少数据库查询次数,提升系统的整体性能。
  3. 分表设计:如果 mailinfo 表的数据量非常大,可以考虑通过分表来降低单个表的查询压力。

到此这篇关于querywrapper中or的使用技巧分享的文章就介绍到这了,更多相关querywrapper or使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

WebSocket 中使用 @Autowired 注入对应为null的解决方案

10-22

Nginx配置WebSocket代理的示例代码

10-14

WebSocket 配置与Nginx 的完美结合(过程详解)

11-06

Nginx配置终极版指南(全网最详细)

11-06

nginx代理webSocket链接,webSocket频繁断开重连方式

09-20

Nginx配置支持WebSocket功能详解

11-20

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论