关键词:MyBatis-Plus、QueryWrapper、动态 SQL、Java、ORM


一、引言

在 Java 后端开发中,MyBatis-Plus(简称 MP)作为 MyBatis 的增强工具,极大地简化了 CRUD 操作。而其中最核心的功能之一,就是动态 SQL 的条件构造器 —— QueryWrapper

你是否还在手写 XML 中的 <if test="...">?是否还在为拼接 SQL 条件而烦恼?QueryWrapper 将带你告别这些痛苦。


二、什么是 QueryWrapper?

QueryWrapper 是 MyBatis-Plus 提供的条件构造器,用于构建 WHERE 子句的查询条件。它通过链式调用的方式,实现了类型安全、可读性强、可复用的 SQL 构造。

类图关系(简化)

QueryWrapper ← AbstractWrapper ← Wrapper
  • Wrapper:抽象根类,定义了条件构造的基本能力。
  • AbstractWrapper:封装了条件拼接逻辑。
  • QueryWrapper:专用于查询操作,支持 SELECT ... WHERE ...

三、快速入门

1. 引入依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>

2. 实体类

@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}

3. Mapper 接口

public interface UserMapper extends BaseMapper<User> {}

4. 使用 QueryWrapper 查询

@Autowired
private UserMapper userMapper;public List<User> getUsers(String name, Integer minAge) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotBlank(name), "name", name).ge(minAge != null, "age", minAge);return userMapper.selectList(wrapper);
}

四、核心方法详解

方法名说明示例
eq等于eq("age", 20)age = 20
ne不等于ne("age", 20)age <> 20
gt / ge大于 / 大于等于gt("age", 18)age > 18
lt / le小于 / 小于等于lt("age", 30)age < 30
like模糊查询like("name", "张")name LIKE '%张%'
in包含in("id", 1, 2, 3)id IN (1,2,3)
isNull / isNotNull空值判断isNull("email")email IS NULL
orderByAsc / orderByDesc排序orderByDesc("create_time")

五、进阶用法

1. 条件优先级(括号控制)

wrapper.and(w -> w.eq("age", 20).or().eq("name", "Tom")).eq("status", 1);

生成的 SQL:

WHERE (age = 20 OR name = 'Tom') AND status = 1

2. 只查询部分字段

wrapper.select("id", "name").eq("age", 25);

3. 排除字段

wrapper.select(User.class, info -> !info.getColumn().equals("password")).eq("status", 1);

六、实战案例:分页 + 多条件搜索

public IPage<User> searchUsers(String name, Integer minAge, Integer maxAge, int current, int size) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotBlank(name), "name", name).ge(minAge != null, "age", minAge).le(maxAge != null, "age", maxAge).orderByDesc("create_time");Page<User> page = new Page<>(current, size);return userMapper.selectPage(page, wrapper);
}

七、常见误区与注意事项

误区正确做法
直接拼接字段名使用 LambdaQueryWrapper 避免硬编码
忽略空值判断使用带 condition 参数的重载方法
滥用 or()使用 and(Consumer<Wrapper>) 明确优先级
忽略 SQL 注入不要手动拼接字符串,使用 MP 提供的 API

八、LambdaQueryWrapper:类型安全升级版

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(name), User::getName, name).ge(minAge != null, User::getAge, minAge);

优点:

  • 编译期检查字段名
  • 避免魔法字符串
  • 支持方法引用

九、总结

特性描述
简洁链式调用,告别 XML
灵活动态条件,支持复杂逻辑
安全防止 SQL 注入
可维护与实体类联动,易于重构

建议

  • 简单查询用 QueryWrapper
  • 生产环境优先使用 LambdaQueryWrapper
  • 复杂 SQL 仍可用 XML 或 @Select

十、参考资料

  • MyBatis-Plus 官方文档
  • GitHub:baomidou/mybatis-plus
  • 《MyBatis-Plus 实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96357.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96357.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96357.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WMIC用法

WMIC用法基本语法结构1. 全局开关&#xff08;可选&#xff0c;控制整体行为&#xff09;2. 别名&#xff08;Alias&#xff09;3. 动词&#xff08;Verb&#xff09;4. 参数&#xff08;可选&#xff09;常用示例帮助命令WMIC&#xff08;Windows Management Instrumentation …

Spring Boot--yml配置信息书写和获取

案例&#xff1a;Spring Boot整合Mybatis步骤一&#xff1a;导入依赖步骤二&#xff1a;添加数据库需要的数据源配置步骤三&#xff1a;编写实体类步骤四&#xff1a;创建mapper类&#xff0c;操作数据库步骤五&#xff1a;创建Service接口和接口实现类步骤六&#xff1a;创建C…

创作纪念日·512天

嘿嘿&#xff0c;不知不觉间&#xff0c;已经到了512天创作纪念日了。 回忆 遥想我在《我的创作纪念日》一篇中写道&#xff0c;想要改名为 十二 &#xff0c;作为对过去生活的怀念&#xff0c;没想到这个名字被抢了&#xff0c;好可惜。 想到25年4月13日写纪念日博客时的自己…

在 Berachain 上,如何通过 BERA 实现一鱼多吃?

Berachain 的 PoL&#xff08;Proof of Liquidity&#xff09;机制是其最具辨识度的创新之一。通过将 DeFi 的激励逻辑深度嵌入共识层&#xff0c;不仅为底层网络注入了充足的流动性&#xff0c;保障了安全性&#xff0c;同时也有效推动了生态应用的增长&#xff0c;更为用户创…

LangGraph和aiagent

1. LangGraph&#xff1a;用图思维重构Agent工作流LangGraph是LangChain团队开源的图式Agent编排框架&#xff0c;它基于"有向图"模型&#xff0c;将Agent的运行流程抽象为"节点 状态流转"。其核心设计理念是用有向状态图&#xff08;Directed State Grap…

《从iptables到ipvs:云原生网络转发的性能拐点突破》

这套基于Spring Cloud Alibaba搭建的架构,部署于阿里云ACK集群的10个4核8G节点上,默认配置6个Pod副本,搭配HPA弹性扩缩容机制与Ingress网关流量分发,理论上具备应对3倍日常流量的承载能力。然而实际运行中,每日早9点、午2点、晚8点三次流量峰值来临时,订单服务会在120秒内…

大数据存储域——Kafka设计原理

摘要本文主要介绍了Kafka的架构原理、消息订阅模式以及在金融风控等领域的应用。Kafka作为数据中转站&#xff0c;可同步不同系统数据&#xff0c;支持事件驱动架构&#xff0c;广泛应用于金融支付与风控场景。其架构包括Producer、Broker、Topic、Partition、Replication、Mes…

[特殊字符] GitHub 热门开源项目速览(2025/09/09)

今天为大家整理了近期 GitHub 上热度较高的开源项目&#xff0c;涵盖 AI Agent、加密计算、操作系统、机器人、PDF 工具 等多个方向。让我们一起看看都有哪些值得关注的项目吧&#xff01; &#x1f539; AI Agents & 开发者工具 parlant &#xff08;⭐ 10.9k | ⬆️ 117…

OpenHarmony之USB Manager 架构深度解析

1. 整体架构 OpenHarmony USB管理器采用三层架构设计: USB API:提供USB的基础API,主要包含查询USB设备的列表、设备插拔通知、USB HOST/DEVICE 功能切换、批量数据传输、控制命令传输、USB设备打开的权限控制及USB device模式下的function功能切换等。 USB Service:主要实…

java面试中经常会问到的mysql问题有哪些(基础版)

文章目录一、基础概念与存储引擎二、索引设计与优化&#xff08;高频重点&#xff09;三、事务与锁&#xff08;核心原理&#xff09;四、SQL性能优化与问题排查五、高可用与数据安全六、其他高频细节问题在Java面试中&#xff0c;MySQL作为最常用的关系型数据库&#xff0c;是…

Tess-two - Tess-two 文字识别(Tess-two 概述、Tess-two 文字识别、补充情况)

一、Tess-two 概述Tess-two 是 Tesseract OCR 引擎在 Android 平台上的一个封装库&#xff0c;用于实现离线文字识别Tess-two 的 GitHub 官网&#xff1a;https://github.com/rmtheis/tess-two二、Tess-two 文字识别 1、演示 &#xff08;1&#xff09;Dependencies 模块级 bui…

八、Win/Linux/macOS全平台彻底卸载Docker的操作指南

八、Win/Linux/macOS全平台彻底卸载Docker的操作指南 系列文章目录 1. 卸载前准备工作(可忽略) 1.1 数据备份 1.2 停止Docker服务 2. 不同操作系统卸载步骤 2.1 Linux系统 2.2 macOS系统 2.3 Windows系统 3. 残留文件深度清理 3.1 Linux系统 3.2 macOS系统 3.3 Windows系统 4…

强化学习-CH9 策略梯度方法

强化学习-CH9 策略梯度方法 当策略被表示为函数时&#xff0c;通过优化目标函数可以得到最优策略。 这种方法称为策略梯度。策略梯度方法是基于策略的&#xff0c;而之前介绍的方法都是基于值的。其本质区别在于基于策略的方法是直接优化关于策略参数的目标函数。 9.1 策略表示…

[玩转GoLang] 5分钟整合Gin / Gorm框架入门

方法 / 步骤 一: Gin框架 1.1 : 环境 & 项目配置 1, GoLand创建项目 创建main.go package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "…

【项目复现】MOOSE-Chem 用于重新发现未见化学科学假说的大型语言模型

项目地址 ZonglinY/MOOSE-Chem: [ICLR 2025] --- ZonglinY/MOOSE-Chem: [ICLR 2025] https://github.com/ZonglinY/MOOSE-Chem git代码同步&#xff1a; 同步地址如下&#xff1a;QianPengfei1/MOOSE-Chem: [ICLR 2025] <MOOSE-Chem: Large Language Models for Rediscove…

深入解析TCP核心机制:连接管理、流量与拥塞控制

目录 一、三次握手与四次挥手&#xff1a;可靠连接的建立与终止 1. 三次握手 - 建立连接 为什么是三次&#xff1f; 2. 四次挥手 - 终止连接 为什么需要TIME_WAIT状态&#xff1f; 二、流量控制与滑动窗口&#xff1a;解决收发速度不匹配 核心机制&#xff1a;滑动窗口协…

如何在 DevOps 管道中实现 AI?

对于许多寻求提升效率、优化性能并缩短上市时间的组织而言,将人工智能 (AI) 集成到 DevOps 流水线中已成为一项战略举措。AI 与 DevOps 的结合,有时被称为 AIOps(面向 IT 运营的人工智能),正在重塑开发和运营团队构建、测试、发布和维护软件应用程序的方式。本文将引导您了…

【Agent】DeerFlow Planner:执行流程与架构设计(基于真实 Trace 深度解析)

本文档系统阐述 DeerFlow 中 Planner 的职责边界、端到端执行流程、关键节点设计、数据结构、容错与人审机制&#xff0c;以及与研究/编码子代理的协同方式。面向开发与运维读者&#xff0c;帮助快速理解与调优 Planner 相关链路。 时序图&#xff08;Sequence Diagram&#xf…

后端接口防止XSS漏洞攻击

有这样一个场景&#xff0c;首先构建一个docx文件并插入超链接&#xff08;恶意的链接&#xff09;&#xff0c;上传到文件服务器后获取对应的文件filekey。现在我们提供一个预览接口&#xff0c;通过filekey便可以预览&#xff0c;在根据filekey转html文档返回给页面的时候由于…

4.1Vue基本使用

1.使用Vue-引入 Vue 的本质,就是一个 JavaScript 的库: 刚开始我们不需要把它想象的非常复杂; 我们就把它理解成一个已经帮我们封装好的库; 在项目中可以引入并且使用它即可。 那么安装和使用 Vue 这个 JavaScript 库有哪些方式呢? 方式一:在页面中通过 CDN 的方式来引…