当前位置: 首页 > news >正文

Mybatis 动态 SQL - trim, where, set

之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子,但这次我们将“ACTIVE = 1”也作为一个动态条件。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOGWHERE<if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if>
</select>

如果没有满足任何条件,会发生什么?你最终会得到类似于下面的SQL语句:

SELECT * FROM BLOG
WHERE

如果只有第二个条件满足,最终的SQL语句将如下所示:

SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’

这也会失败。这个问题不容易通过条件语句解决,如果你曾经不得不写过它,那么你很可能再也不想这样做了。

MyBatis 在大多数情况下有一个简单的答案,可能在 90% 的情况下都能起作用。而在它无法满足要求的情况下,你可以自定义它来达到目的。只需要一个简单的改变,一切都会正常工作:

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

如果 ​<where>​元素中的嵌套标签返回任何内容,它会知道只在查询条件非空时插入 "WHERE" 关键字。此外,如果条件的内容以 "AND" 或 "OR" 开头,它会自动去掉这些关键字。

如果`<where>`元素的行为不符合您的要求,您可以通过定义自己的`<trim>`元素来进行自定义。例如,与`<where>`元素相对应的`<trim>`元素可以是:

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

​<trim>​元素的 ​prefixOverrides​属性接受一个使用管道符分隔的文本列表,其中空格是有关的。结果是删除 ​prefixOverrides​属性中指定的内容,并插入 ​prefix​属性中指定的内容。

对于动态更新语句,也有一个类似的解决方案,称为`<set>`元素。`<set>`元素可以用于动态包含要更新的列,以及排除其他列。例如:

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

在这个例子中,​<set>​元素将动态添加 "SET" 关键字,并且在应用条件后消除任何多余的逗号。

另外,您也可以通过使用`<trim>`元素来实现相同的效果:

<trim prefix="SET" suffixOverrides=",">...
</trim>

请注意,在这种情况下,我们覆盖的是后缀,而仍然附加前缀。

相关文章:

Mybatis 动态 SQL - trim, where, set

之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子&#xff0c;但这次我们将“ACTIVE 1”也作为一个动态条件。 <select id"findActiveBlogLike"resultType"Blog">SELECT * FROM BLOGWHERE<if test&qu…...

大模型系列:OpenAI使用技巧_使用OpenAI进行K-means聚类

文章目录 1. 使用K-means算法找到聚类2. 聚类中的文本样本和聚类的命名让我们展示每个聚类中的随机样本。 我们使用一个简单的k-means算法来演示如何进行聚类。聚类可以帮助发现数据中有价值的隐藏分组。数据集是在 Get_embeddings_from_dataset Notebook中创建的。 # 导入必要…...

共享单车之数据分析

文章目录 第1关&#xff1a;统计共享单车每天的平均使用时间第2关&#xff1a;统计共享单车在指定地点的每天平均次数第3关&#xff1a;统计共享单车指定车辆每次使用的空闲平均时间第4关&#xff1a;统计指定时间共享单车使用次数第5关&#xff1a;统计共享单车线路流量 第1关…...

Spring的Bean你了解吗

Bean的配置 Spring容器支持XML(常用)和Properties两种格式的配置文件 Spring中XML配置文件的根元素是,中包含了多个子元素&#xff0c;每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中 元素包含了多个属性以及子元素&#xff0c;常用属性及子元素如下所示 i…...

MongoDB聚合:$merge 阶段(1)

$merge的用途是把聚合管道产生的结果写入指定的集合&#xff0c;有时候可以用$merge来做物化视图。需要注意&#xff0c;$meger操作必须是聚合管道的最后一个阶段。具体功能有&#xff1a; 能够输出到当前或不同的数据库能够输出到正在聚合的集合&#xff08;慎重&#xff1a;…...

2. 云原生实战之kubesphere搭建

文章目录 机器介绍centos基本配置安装 VMware Tools设置静态ip关闭防火墙关闭SELinux开启时间同步配置host和hostname 安装kubesphere依赖项安装配置文件准备执行安装命令 机器介绍 在ESXI中准备虚拟机&#xff0c;部署参考官网&#xff1a;https://kubesphere.io/zh/ CentOs…...

main参数传递、反汇编、汇编混合编程

week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12&#xff0c;可以调用atoi…...

前后端分离nodejs+vue医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1a;Express/koa 前端:Vue.js 数据库&#xff1a;mysql 开发软件&#xff1a;VScode/webstorm/hbuiderx均…...

在pytorch中,读取GPU上张量的数值 (数据从GPU到CPU) 的几种常用方法

1、.cpu() 方法&#xff1a; 使用 .cpu() 方法可以将张量从 GPU 移动到 CPU。这是一种简便的方法&#xff0c;常用于在进行 CPU 上的操作之前将数据从 GPU 取回 import torch# 在 GPU 上创建一个张量 gpu_tensor torch.tensor([1, 2, 3], devicecuda)# 将 GPU 上的张…...

【mysql】—— 表的内连和外连

在MySQL中&#xff0c;内连&#xff08;INNER JOIN&#xff09;和外连&#xff08;OUTER JOIN&#xff09;是用于联接多个表的操作。接下来&#xff0c;我分别给大家介绍下二者。 目录 &#xff08;一&#xff09;内连接 1、什么叫内连接 2、语法格式 3、案例&#xff1a;显…...

VSCode远程开发配置

目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码&#xff0c;使用远程开发&#xff0c;可以在与生产环境相同的环境中开发、测试和部署代码&#xff0c;减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…...

复数值神经网络可能是深度学习的未来

一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。...

【C语言】数据结构——排序二(快排)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;数组打印与交换1. 交换排序1.1 基本思想&#xff1a;1.2 冒泡与快排的异同 2. 冒泡排序2.1 基本思想2.2 …...

企业私有云容器化架构

什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统&#xff0c;在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual Machine Monitor&#xff0c;VMM&#x…...

SpringBoot+modbus4j实现ModebusTCP通讯读取数据

场景 Windows上ModbusTCP模拟Master与Slave工具的使用&#xff1a; Windows上ModbusTCP模拟Master与Slave工具的使用-CSDN博客 Modebus TCP Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 1996年施耐德公司推出基于以太网TCP/IP的Modbus协议&…...

Linux性能优化全景指南

Part1 Linux性能优化 1、性能优化性能指标 高并发和响应快对应着性能优化的两个核心指标&#xff1a;吞吐和延时 应用负载角度&#xff1a;直接影响了产品终端的用户体验系统资源角度&#xff1a;资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈&#xff0c;但…...

树莓派 ubuntu20.04下 python调讯飞的语音API,语音识别和语音合成

目录 1.环境搭建2.去讯飞官网申请密钥3.语音识别&#xff08;sst&#xff09;4.语音合成&#xff08;tts&#xff09;5.USB声卡可能报错 1.环境搭建 #环境说明&#xff1a;(尽量在ubuntu下使用, 本次代码均在该环境下实现) sudo apt-get install sox # 安装语音播放软件 pip …...

分布式系统架构设计之分布式系统实践案例和未来展望

分布式系统在过去的几十年里经历了长足的发展&#xff0c;从最初的简单分布式架构到今天的微服务、云原生等先进架构&#xff0c;取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践&#xff0c;并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …...

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…...

彻底理解前端安全面试题(1)—— XSS 攻击,3种XSS攻击详解,建议收藏(含源码)

前言 前端关于网络安全看似高深莫测&#xff0c;其实来来回回就那么点东西&#xff0c;我总结一下就是 3 1 4&#xff0c;3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略&#xff0c;其他的都是网络攻击。除了这…...

半导体光刻中的OPC技术与掩模数据优化

1. 光学邻近校正(OPC)与掩模数据准备(MDP)基础解析 在半导体制造的光刻工艺中&#xff0c;光学邻近效应(Optical Proximity Effect)是导致晶圆上实际图形与设计图形产生偏差的主要因素之一。当特征尺寸接近或小于曝光波长时&#xff0c;光的衍射效应会导致图案边缘出现圆角、线…...

终极解放!淘宝自动任务神器让你每天多出30分钟自由时间

终极解放&#xff01;淘宝自动任务神器让你每天多出30分钟自由时间 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 你知…...

Visual Studio Code 在 MacOS 在 Linux 上的完整安装与高效开发指南:从部署到远程开发实战

VVisual Studio Code 在 MacOS 在 Linux 上的完整安装与高效开发指南&#xff1a;从部署到远程开发实战 摘要一、VS Code 简介二、下载与安装1. 下载 VS Code2. 安装步骤方法 1&#xff1a;通过包管理器安装&#xff08;以 Ubuntu/Debian 为例&#xff09;方法 2&#xff1a;通…...

【信息科学与工程学】【通信工程】第六篇02 5G-A6G 智能超表面

一、智能超表面 1.1 智能超表面基础 智能超表面(RIS)是一项前沿技术,它让我们能够像“指挥”光一样,去灵活地操控看不见的电磁波,从而构建一个智能、高效的无线环境。 理解维度 核心内容 关键点 它是什么?(核心特征)​ 一种可编程的二维人工电磁表面 由大量超材…...

Next.js SEO优化实战:用next-seo库高效管理元标签与结构化数据

1. 项目概述&#xff1a;SEO 优化的现代 React 解决方案 如果你正在用 Next.js 开发一个需要被搜索引擎收录的网站&#xff0c;比如企业官网、博客或者电商平台&#xff0c;那么“SEO”这个词一定让你又爱又恨。爱的是&#xff0c;它意味着流量和用户&#xff1b;恨的是&#…...

ServerPackCreator:3分钟搞定Minecraft服务器包配置的智能自动化工具

ServerPackCreator&#xff1a;3分钟搞定Minecraft服务器包配置的智能自动化工具 【免费下载链接】ServerPackCreator Create a server pack from a Minecraft Forge, NeoForge, Fabric, LegacyFabric or Quilt modpack! 项目地址: https://gitcode.com/gh_mirrors/se/Server…...

月薪3000和年薪百万,差距凭什么这么大?行业“薪资金字塔”大揭秘!

文章揭示了具身智能行业内部的巨大薪资差距&#xff0c;分为金字塔底层&#xff08;机器人训练师&#xff09;、中层&#xff08;AI应用/AI Agent开发&#xff09;和顶层&#xff08;核心算法人才&#xff09;三个层次。底层薪资约为19.5万元&#xff0c;主要依靠执行力和耐心&…...

株洲彩钢板厂家

彩钢板 彩色涂层钢板 以冷轧/镀锌钢板为基材&#xff0c;表面脱脂、磷化后&#xff0c;辊涂彩色有机涂层&#xff08;聚酯、氟碳等&#xff09;&#xff0c;再烘烤成型。二、主要分类&#xff08;3大类&#xff09;1. 彩钢压型板&#xff08;单板/彩钢瓦&#xff09;• 结构&a…...

AI代理如何通过MCP协议实现DeFi自动化操作与安全交互

1. 项目概述&#xff1a;当DeFi遇上AI代理&#xff0c;一场链上金融的自动化革命如果你和我一样&#xff0c;在DeFi&#xff08;去中心化金融&#xff09;世界里摸爬滚打了好几年&#xff0c;从早期的流动性挖矿到后来的各种收益聚合器&#xff0c;一个深刻的体会是&#xff1a…...

Simba MCP Server:用AI助手对话式驱动贝叶斯营销组合模型分析

1. 项目概述&#xff1a;当贝叶斯营销组合模型遇上AI助手如果你是一名市场分析师、营销科学家&#xff0c;或者任何需要回答“我的营销预算到底花得值不值”的人&#xff0c;那么你对营销组合模型&#xff08;MMM&#xff09;一定不陌生。这玩意儿是量化不同营销渠道&#xff0…...