使用 MyBatis-Plus Wrapper 构建自定义 SQL 查询

前言

MyBatis-Plus (MP) 是一款基于 MyBatis 的增强工具,它简化了数据库操作,提供了诸如自动分页、条件构造器等功能,极大地提高了开发效率。其中,Wrapper 条件构造器是 MP 的核心功能之一,它允许开发者以链式调用的方式构造复杂的查询条件,而无需编写繁琐的SQL语句。本文简单讲讲如何使用 MyBatis-PlusWrapper 来构建复杂的查询条件,并结合自定义 SQL 片段,实现更加灵活的数据访问。

1. 环境准备

确保你的项目中已正确引入 mybatis-plus 相关依赖,并且版本至少为 3.0.7,以支持自定义 SQL 功能。

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> <!-- 或更高 -->
</dependency>
2. 使用 Wrapper 自定义 SQL

MyBatis-Plus 提供了强大的条件构造器(Wrapper),用于构建复杂的查询和更新条件。通过 Wrapper,开发者可以避免编写繁琐的 SQL 语句,提高代码的安全性和可维护性。下面介绍如何利用 Wrapper 结合自定义 SQL 片段来实现复杂查询。

2.1 参数命名与引用

在自定义 SQL 中传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。然后,在 SQL 语句中,可以通过 ${ew.customSqlSegment} 引用 Wrapper 对象生成的 SQL 片段。

2.2 编写 Mapper 接口方法

定义一个接口方法,使用自定义的 SQL 语句,并通过 ${ew.customSqlSegment} 引入 Wrapper 对象生成的 SQL 片段。

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import java.util.List;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user ${ew.customSqlSegment}")List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
2.3 调用示例

调用上述方法并传入一个 Wrapper 对象:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");List<User> userList = userMapper.selectByCustomSql(queryWrapper);

这段代码会执行一个带有 WHERE name = '张三' 条件的查询,返回所有符合条件的用户记录。

3. 注意事项
  • 线程安全性Wrapper 实例不是线程安全的,因此建议每次使用时创建新的 Wrapper 实例。
  • SQL 注入防护:务必对任何前端传入的 SQL 片段进行严格过滤,防止 SQL 注入攻击。
  • 不支持基于 entity 的 where 语句:当使用自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 WHERE 子句,你需要手动编写完整的 SQL 语句。
4. 高级功能

除了基本的条件构造外,MyBatis-Plus 还提供了 Lambda 表达式风格的 Wrapper,如 LambdaQueryWrapperLambdaUpdateWrapper,这使得代码更加清晰和易于维护,特别是在字段名可能变化的情况下。

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName, "王");

此外,Wrapper 支持多种条件组合,如 eq, ne, gt, lt, between, like, in, isNull, groupBy, orderBy, having 等,满足不同的查询需求。

5. 总结

通过 MyBatis-PlusWrapper 功能,开发者能够以链式调用的方式快速构建复杂的查询条件,同时结合自定义 SQL 片段,实现了更灵活的数据访问方式。


参考资料

  • MyBatis-Plus 官方文档
  • GitHub - MyBatis-Plus

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

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

相关文章

【第二节】Git 工作流程、概念及仓库创建

目录 一、Git 工作流程 二、Git 基本概念 2.1 工作区 2.2 暂存区 2.3 版本库 2.4 操作流程 三、Git 仓库创建 3.1 初始化仓库 3.2 克隆仓库 一、Git 工作流程 Git 的工作流程通常包括以下几个步骤&#xff1a; 1. **克隆 Git 资源**&#xff1a;将远程 Git 仓库克隆到…

概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution

目录 1 泊松分布的基本内容 1.1 泊松分布的关键点 1.1.1 属于离散分布 1.1.2 泊松分布的特点&#xff1a;每个子区间内概率相等 &#xff0c; λ就是平均概率 1.2 核心参数 1.3 pmf公式 1.4 期望和方差 2 例1&#xff1a;用EXCEL计算泊松分布的概率 3 比较λ不同值时…

【机器学习】【无监督学习——聚类】从零开始掌握聚类分析:探索数据背后的隐藏模式与应用实例

从零开始掌握聚类分析&#xff1a;探索数据背后的隐藏模式与应用实例 基本概念聚类分类聚类算法的评价指标&#xff08;1&#xff09;内部指标轮廓系数&#xff08;Silhouette Coefficient&#xff09;DB指数&#xff08;Davies-Bouldin Index&#xff09;Dunn指数 &#xff08…

灵活接入第三方接口,解析第三方json数据,返回我们想要的json格式

需求&#xff1a;我想接入任意第三方http 接口&#xff08;暂不考虑鉴权问题&#xff09;、接口返回任意json数据。 1、要求返回的json数据通过我的R< T > 返回。 2、我的R< T > 里面包含参数 data&#xff0c;code&#xff0c;msg&#xff0c;success标识。 3、…

Nginx 在不同操作系统下的安装指南

Nginx 在不同操作系统下的安装指南 一、Linux 系统下 Nginx 的安装 &#xff08;一&#xff09;基于 Ubuntu 系统 更新软件包列表 打开终端&#xff0c;首先执行sudo apt-get update命令。这一步是为了确保系统的软件包列表是最新的&#xff0c;能够获取到最新版本的 Nginx 及…

docker redis 详细教程

1. 拉取镜像 docker pull redis 2. 创建数据存储目录 cd /home/ mkdir redis cd redis mkdir data mkdir log mkdir conf 3.创建容器并且运行 docker run \ -p 6379:6379 \ --name redis \ -v /home/redis/data:/data \ -d redis 参考链接 史上最详细Docker安装Redis &am…

学技术学英文:代码中的锁:悲观锁和乐观锁

本文导读&#xff1a; 1. 举例说明加锁的场景&#xff1a; 多线程并发情况下有资源竞争的时候&#xff0c;如果不加锁&#xff0c;会出现数据错误&#xff0c;举例说明&#xff1a; 业务需求&#xff1a;账户余额>取款金额&#xff0c;才能取钱。 时间线 两人共有账户 …

云计算赋能:TSP 问题求解与创新定价机制的全景剖析

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月18日14点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址&#xff1a; Aspiringco…

二、windows环境下vscode使用wsl教程

本篇文件介绍了在windows系统使用vscode如何连接使用wsl&#xff0c;方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode&#xff0c;按快捷键CtrlShiftX打开插件市场&#xff0c;搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…

QScreen在Qt5.15与Qt6.8版本下的区别

简述 QScreen主要用于提供与屏幕相关的信息。它可以获取有关显示设备的分辨率、尺寸、DPI&#xff08;每英寸点数&#xff09;等信息。本文主要是介绍Qt5.15与Qt6环境下&#xff0c;QScreen的差异&#xff0c;以及如何判断高DPI设备。 属性说明 logicalDotsPerInch&#xff1…

【已解决】在Visual Studio里将应用与Microsoft Store关联时提示网络异常

发布Windows应用时。在Visual Studio里点击"发布“&#xff0c;将应用与Microsoft Store关联时&#xff0c;一直提示网络错误。 查了一下论坛&#xff0c;发现之前也经常出现&#xff0c;但我是第一次遇到。 不能就这样一直被卡着呀&#xff0c;研究了一下&#xff0c;还…

【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用

文章目录 一、while 循环1、语法&#xff1a;2、示例&#xff1a; 二、 do-while 循环1、语法&#xff1a;2、示例&#xff1a; 三、for 循环1、语法&#xff1a;2、示例&#xff1a; 四、foreach 循环1、语法&#xff1a;2、示例&#xff1a; 五、总结对比六、注意事项七、使用…

【数据分析】数据结构数据内容概述

文章目录 表格结构数据特征数据类别结构化数据表格结构数据层级表格结构的数据类型单元格的格式属性 表格结构数据获取方法从企业后台数据库系统获取后台数据库系统获取数据流程前端操作平台获取从企业外部渠道获取数据 表格结构数据使用方法单元格值的引用方法单元格区域值的引…

控制策略和算法:两者的类型、应用领域

目录 控制策略类型&#xff1a; 控制算法类型&#xff1a; 应用领域&#xff1a; 其他学术知识 控制策略类型&#xff1a; 开环控制&#xff1a; 在没有反馈的情况下&#xff0c;控制信号是根据对系统模型的预测或设定目标生成的。适用于系统动态特性已知且外部干扰较小的情…

Nacos 3.0 考虑升级到 Spring Boot 3 + JDK 17 了!

Nacos 由阿里开源&#xff0c;是 Spring Cloud Alibaba 中的一个重要组件&#xff0c;主要用于发现、配置和管理微服务。 由于 Spring Boot 2 的维护已于近期停止&#xff0c;Nacos 团队考虑升级到 Spring Boot 3 JDK 17&#xff0c;目前正在征求意见和建议。 这其实是一件好…

【笔记】RT-Thread Studio+STM32CubeMX联合开发,使用SPI+DMA驱动WS2812B RGB灯条,实现单独操控任意灯珠。

硬件平台&#xff1a;STM32L431RCT6 软件版本&#xff1a;RT-Thread Studio 2.2.8&#xff0c;STM32CubeMX 6.12.0 RT-Thread版本&#xff1a;4.1.0 言&#xff1a;之前写过一篇WS2812B的教程&#xff0c;但是最近扒出来用发现不能单独点亮或者熄灭特定位置的灯珠&#xff0c;只…

Vue 中实现节点对齐

Vue 如何将两个 Dom 节点进行对对齐&#xff0c;在前端页面中如何快速的对两个节点元素进行对齐操作&#xff0c;最简单的方式就是使用 Postion&#xff1a;Relative 加 Absolute 实现两个元素的相对位置。今天使用 dom-align 库实现节点对齐&#xff0c;实现以下效果&#xff…

计算机网络-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前&#xff0c;咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

NLP 分词技术浅析

一、NLP 分词技术概述 &#xff08;一&#xff09;定义 自然语言处理&#xff08;NLP&#xff09;中的分词技术是将连续的文本序列按照一定的规则切分成有意义的词语的过程。例如&#xff0c;将句子 “我爱自然语言处理” 切分为 “我”、“爱”、“自然语言处理” 或者 “我…