Mybatis的动态SQL
动态 sql 是Mybatis的强⼤特性之⼀,能够完成动态的 sql 语句拼接。
动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。
Mybatis里的动态标签主要有:
<if><trim><where><set><foreach>.
<if>标签:条件选择
一般在我们注册账号的时候,都会有必填字段和⾮必填字段,那么非必填字段就有两种状态了,填或不填。这时候就是动态SQL了,在填的时候我们把数据加上,在不填的时候,我们不加。所以在添加⽤户的时候有不确定的字段传⼊,那么如何实现呢?
解决方法就是<if> 标签,那么if标签如何使用呢?语法规则如下:
<if test="判断条件">SQL语句
</if>
举个例子:
<insert id="insertBatch">insert into articleinfo (title,content,uid<if test="state!=null">,state</if>)values(#{title},#{content},#{uid}<if test="state!=null">,#{state}</if>)</insert>
<trim>标签
前边<if>标签可以实现动态的字段存储,那么和<trim>标签结合起来,可以实现多个字段的动态存储。
trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
- refix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后trim
语法格式如下:
<trim prefix="前缀" suffix="后缀" prefixOverrides="去掉前缀字符" suffixOverrides="去掉后缀字符">SQL语句
</trim>
使用实例:
<insert id="insertBatch2">insert into articleinfo<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=","><if test="rcount!=null">rcount,</if><if test="title!=null">title,</if><if test="content!=null">content,</if><if test="uid!=null">uid</if></trim>values<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=","><if test="rcount!=null">#{rcount}, </if><if test="title!=null">#{title},</if><if test="content!=null">#{content},</if><if test="uid!=null">#{uid}</if></trim></insert>
<where>标签
where用于条件判断,他后边的语句都是条件,但是如果判断语句也为非必填的项,那么在多个非必填的时候用where就可能会导致语法错误。这时候就要用where标签了。
作用:生成where关键字; 去除过于and; 没有where条件就不生成where关键字。
语法如下:
<where><if test="判断条件">AND/OR ...</if>
</where>
使用实例:
<select id="queryByWhere2" resultType="com.example.springmybatisdemo.model.Article">select *from articleinfo<where><if test="uid!=null">and uid=#{uid}</if><if test="title!=null">and title=#{title}</if><if test="state!=null">and state=#{state}</if></where></select>
那么,对上边的trim标签熟练的就可以发现,
这里的where标签可以用 <trim prefix="where" prefixOverrides="and">进行替换。
<set>标签
可以使⽤标签来动态指定内容的增加。
作用:生成set关键字; 去除最后一个“,”
语法格式:
<set><if test="判断条件">,</if>
</set>
使用:
<update id="updateTest2">update articleinfo<set><if test="uid!=null">uid=#{uid},</if><if test="content!=null">content=#{content},</if><if test="title!=null">title=#{title}</if></set></update>
这里可以使⽤ <trim prefix="set" suffixOverrides=",">替换
<foreach>标签
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符
<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">#{item}
</foreach>
使用实例:
<delete id="BatchDelete">
-- delete from articleinfo where uid in(2,3,4,5)delete from articleinfo where uid in<foreach collection="list1" open="(" close=")" separator="," item="uid">#{uid}</foreach></delete>
使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
- 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list,也可以是用@Param注解给list重命名,传入重命名也可以。
- 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
- 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
相关文章:
Mybatis的动态SQL
动态 sql 是Mybatis的强⼤特性之⼀,能够完成动态的 sql 语句拼接。 动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 Mybatis里的动态标签主要有: <if><trim><where><set><forea…...
嵌入式系统中的GPIO控制:从理论到实践与高级应用
本文将探讨嵌入式系统中的GPIO(通用输入输出)控制,着重介绍GPIO的原理和基本用法。我们将使用一个实际的示例项目来演示如何通过编程配置和控制GPIO引脚。将基于ARM Cortex-M微控制器,并使用C语言进行编写。 GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工…...
7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?
7D透明屏是一种新型的显示技术,它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域,如商业广告、展览展示、智能家居等,具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术,将图像通过透明屏幕投射出来…...
[游戏开发][Unity] 打包Xcode工程模拟器+真机调试
苹果开发者账号 账号分三类,个人,公司,企业,价格99/99/299美金 新注册账号的基本设置按网上的教程来就行 我们公司是企业账号,我的苹果开发者账号是公司一个User 下面讲述一下一个全新的打包机处理流程 首先是要把…...
python 添加环境变量
1 查看是否设置环境变量 和 使用的python在哪里安装 import sys import os# 获取Python的安装目录 import os import syspython_path sys.executable # 这个是python.exe的路径python_path os.path.dirname(python_path) print("Python安装路径:", python_path)# …...
如何用DHTMLX组件为Web应用创建甘特图?(一)
dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一,DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…...
网站SEO优化:提升搜索排名与流量引爆
导言: 在互联网时代,网站SEO(搜索引擎优化)是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面,让搜索引擎更好地理解和收录网站内容,从而为网站带来更多有价值的有机…...
Java lamda对List<JSONObject>里多个动态属性字段进行动态的降序或者升序
最近做到一个需求,需要把业务侧返回的数据(格式为List<JSONObject>),然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对List<JSONObject>中的多个属性字段进行动态的升序或降序排序,我们可以根据需…...
Lua脚本解决多条命令原子性问题
Redis是一个流行的键值存储数据库,它提供了丰富的功能和命令。在Redis中,我们可以使用Lua脚本来编写多条命令,以确保这些命令的原子性执行。Lua是一种简单易学的编程语言,下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…...
NAT详解(网络地址转换)
一句话说清楚它是干什么的: 网络地址转换:是指通过专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址,它使得整个专用网只需要一个全球IP就可以访问互联网,由于专用网IP地址是可以重用的,所以NAT大…...
【第一阶段】ktolin的函数
在Java中我们称之为方法,方法必须写在类里面,依赖于类。 在kotlin中函数写在类里面和外面都是可以的。称之为函数 class test{fun view(){} }fun main() {println("Hello, world!!!") }执行结果 Hello, world!!!main函数的返回值类型为Unit等…...
pytorch模型的保存与加载
1 pytorch保存和加载模型的三种方法 PyTorch提供了三种种方式来保存和加载模型,在这三种方式中,加载模型的代码和保存模型的代码必须相匹配,才能保证模型的加载成功。通常情况下,使用第一种方式(保存和加载模型状态字…...
IDE /完整分析C4819编译错误的本质原因
文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…...
前端学习路线(2023)
这个前端学习路线看起来很详细和全面,涵盖了从基础知识到高级框架,从单机开发到全栈项目,从混合应用到原生应用,从性能优化到架构设计的各个方面。如果你能够按照这个路线学习和实践,我相信你一定能够成为一名优秀的前…...
景区如何对旅行社进行分销管理?
旅行社的买票能力强,一般景区会跟多家旅行社合作门票分销。其中卖票下单、价格设定、财务对账结算都出现了很多问题,导致对账困难,查询困难,甚至可能有偷票漏票的情况出现,给景区收入造成损失。那要怎么处理呢…...
四步从菜鸟到高手,Python编程真的很简单(送书第一期:文末送书2本)
🍁博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我…...
Thread类的常用结构(java))
1 构造器 public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :指定创建线程的目标对象,它实现了Runnable接口中的run方法public Thread(Runnable target,String name) :分配一…...
CSS :nth-child
CSS :nth-child :nth-child 伪类根据元素在同级元素中的位置来匹配元素. CSS :nth-child 语法 值是关键词 odd/evenAnB最新的 [of S] 语法权重 浏览器兼容性 很简单的例子, 来直觉上理解这个伪类的意思 <ul><li class"me">Apple</li><li>B…...
国内好用的企业级在线文档有哪些?
在当今数字化时代,企业级在线文档已经成为了现代办公环境中不可或缺的一部分。它不仅能够提高工作效率,还能够实现多人协同编辑,满足团队协作的需求。那么,在国内市场上,哪些企业级在线文档产品备受企业青睐呢…...
P1217 [USACO1.5] 回文质数 Prime Palindromes
题目描述 因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 151 是回文质数。 写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000…...
一键部署MedGemma:打造个人医学AI研究环境
一键部署MedGemma:打造个人医学AI研究环境 1. 为什么需要医学AI研究环境 在医学影像分析领域,研究人员常常面临两个主要挑战:一是缺乏高效的工具来快速验证新的AI模型在医学影像上的表现,二是需要一个直观的界面来展示和解释AI的…...
DM数据库迁移实战:dimp与dexp版本兼容性问题解析与解决方案
1. 当DM数据库迁移遇上版本兼容性问题 最近在帮客户做DM数据库迁移时,遇到了一个典型问题:用高版本dexp导出的数据文件,无法用低版本dimp导入。这就像用最新版Word写的文档,用老版本打不开一样让人头疼。具体表现是执行导入命令时…...
如何保证代码质量?
一、编码阶段:从源头控制质量1. 统一代码规范(强制执行)核心目标:减少风格差异,提高可读性常见工具:ESLint:代码规范校验Prettier:自动格式化Stylelint:样式规范…...
Polars 2.0 + Delta Lake + DuckDB三端协同清洗方案(附GitHub Star 1.2k的私有化部署模板)
第一章:Polars 2.0 Delta Lake DuckDB三端协同清洗方案概览现代数据工程正面临高吞吐、低延迟与强一致性三重挑战。Polars 2.0 以 Rust 驱动的惰性执行引擎提供亚毫秒级列式计算能力;Delta Lake 2.4 引入统一元数据协议与事务日志快照机制,…...
多人对话录音整理神器:ClearerVoice-Studio语音分离功能详细教程
多人对话录音整理神器:ClearerVoice-Studio语音分离功能详细教程 1. 引言:告别混乱的多人录音 你是否经常需要整理会议录音、访谈记录或多人讨论内容?传统的录音文件往往混杂着多个人的声音,背景噪音干扰严重,整理起…...
AMC1100隔离放大器实战:如何用DUB封装搞定三相电流电压测量?
AMC1100隔离放大器实战:DUB封装在三相测量中的高阶应用 工业电力监测领域对精度与安全性的双重苛求,催生了隔离放大器技术的持续迭代。当我在某变电站监测系统升级项目中首次接触AMC1100时,这款采用DUB封装的全差分隔离放大器以其独特的抗磁场…...
DownKyi:B站视频高效解决方案——如何三步搞定8K资源本地化管理
DownKyi:B站视频高效解决方案——如何三步搞定8K资源本地化管理 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印…...
福人板材靠谱供应商:企业采购决策核心要素解析
福人板材靠谱供应商:企业采购决策核心要素解析“选对福人板材靠谱供应商,比砍价更重要——企业采购决策的8个核心要素,少一个都可能踩坑”对于中小制造企业、装饰公司等采购方而言,福人板材作为行业知名的环保板材品牌,…...
告别网络烦恼:Stanza 1.5.1英文语言模型离线安装保姆级教程(Anaconda环境专用)
深度解析Stanza 1.5.1英文语言模型离线部署:Anaconda环境全流程实战 在企业内网或学术研究环境中,我们常常面临无法直接访问外部资源的情况。这时,掌握关键工具的离线部署能力就显得尤为重要。今天我们将全面剖析自然语言处理工具Stanza在受限…...
AI 模型推理引擎性能比较
AI模型推理引擎性能比较:解锁高效计算的秘密 在人工智能技术快速发展的今天,AI模型推理引擎的性能直接决定了实际应用的效率和成本。无论是云端服务还是边缘设备,选择一款高效的推理引擎可以大幅提升响应速度、降低资源消耗。本文将从计算速…...
