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

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的强⼤特性之⼀&#xff0c;能够完成动态的 sql 语句拼接。 动态 SQL 大大减少了编写代码的工作量&#xff0c;更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 Mybatis里的动态标签主要有: <if><trim><where><set><forea…...

嵌入式系统中的GPIO控制:从理论到实践与高级应用

本文将探讨嵌入式系统中的GPIO(通用输入输出)控制,着重介绍GPIO的原理和基本用法。我们将使用一个实际的示例项目来演示如何通过编程配置和控制GPIO引脚。将基于ARM Cortex-M微控制器,并使用C语言进行编写。 GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工…...

7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?

7D透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业广告、展览展示、智能家居等&#xff0c;具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术&#xff0c;将图像通过透明屏幕投射出来…...

[游戏开发][Unity] 打包Xcode工程模拟器+真机调试

苹果开发者账号 账号分三类&#xff0c;个人&#xff0c;公司&#xff0c;企业&#xff0c;价格99/99/299美金 新注册账号的基本设置按网上的教程来就行 我们公司是企业账号&#xff0c;我的苹果开发者账号是公司一个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图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…...

网站SEO优化:提升搜索排名与流量引爆

导言&#xff1a; 在互联网时代&#xff0c;网站SEO&#xff08;搜索引擎优化&#xff09;是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面&#xff0c;让搜索引擎更好地理解和收录网站内容&#xff0c;从而为网站带来更多有价值的有机…...

Java lamda对List<JSONObject>里多个动态属性字段进行动态的降序或者升序

最近做到一个需求&#xff0c;需要把业务侧返回的数据&#xff08;格式为List<JSONObject>&#xff09;,然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对List<JSONObject>中的多个属性字段进行动态的升序或降序排序&#xff0c;我们可以根据需…...

Lua脚本解决多条命令原子性问题

Redis是一个流行的键值存储数据库&#xff0c;它提供了丰富的功能和命令。在Redis中&#xff0c;我们可以使用Lua脚本来编写多条命令&#xff0c;以确保这些命令的原子性执行。Lua是一种简单易学的编程语言&#xff0c;下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…...

NAT详解(网络地址转换)

一句话说清楚它是干什么的&#xff1a; 网络地址转换&#xff1a;是指通过专用网络地址转换为公用地址&#xff0c;从而对外隐藏内部管理的IP地址&#xff0c;它使得整个专用网只需要一个全球IP就可以访问互联网&#xff0c;由于专用网IP地址是可以重用的&#xff0c;所以NAT大…...

【第一阶段】ktolin的函数

在Java中我们称之为方法&#xff0c;方法必须写在类里面&#xff0c;依赖于类。 在kotlin中函数写在类里面和外面都是可以的。称之为函数 class test{fun view(){} }fun main() {println("Hello, world!!!") }执行结果 Hello, world!!!main函数的返回值类型为Unit等…...

pytorch模型的保存与加载

1 pytorch保存和加载模型的三种方法 PyTorch提供了三种种方式来保存和加载模型&#xff0c;在这三种方式中&#xff0c;加载模型的代码和保存模型的代码必须相匹配&#xff0c;才能保证模型的加载成功。通常情况下&#xff0c;使用第一种方式&#xff08;保存和加载模型状态字…...

IDE /完整分析C4819编译错误的本质原因

文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…...

前端学习路线(2023)

这个前端学习路线看起来很详细和全面&#xff0c;涵盖了从基础知识到高级框架&#xff0c;从单机开发到全栈项目&#xff0c;从混合应用到原生应用&#xff0c;从性能优化到架构设计的各个方面。如果你能够按照这个路线学习和实践&#xff0c;我相信你一定能够成为一名优秀的前…...

景区如何对旅行社进行分销管理?

旅行社的买票能力强&#xff0c;一般景区会跟多家旅行社合作门票分销。其中卖票下单、价格设定、财务对账结算都出现了很多问题&#xff0c;导致对账困难&#xff0c;查询困难&#xff0c;甚至可能有偷票漏票的情况出现&#xff0c;给景区收入造成损失。那要怎么处理呢&#xf…...

四步从菜鸟到高手,Python编程真的很简单(送书第一期:文末送书2本)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支持&#xff0c;我…...

Thread类的常用结构(java))

1 构造器 public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :指定创建线程的目标对象&#xff0c;它实现了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…...

国内好用的企业级在线文档有哪些?

在当今数字化时代&#xff0c;企业级在线文档已经成为了现代办公环境中不可或缺的一部分。它不仅能够提高工作效率&#xff0c;还能够实现多人协同编辑&#xff0c;满足团队协作的需求。那么&#xff0c;在国内市场上&#xff0c;哪些企业级在线文档产品备受企业青睐呢&#xf…...

P1217 [USACO1.5] 回文质数 Prime Palindromes

题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 151 是回文质数。 写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...