详细分析Mybatis中的<foreach>标签

目录

  • 前言
  • 1. 基本语法
  • 2. Demo
  • 3. 实际例子

前言

对于Java专栏:Java专栏
对于Mybatis的相关知识可看我之前的文章:Mybatis从入门到精通(全)
对于其余Java框架可看我之前的文章:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

对于上述Mybatis中曾有讲过foreach标签!此篇博客对其标签进行拓展

1. 基本语法

MyBatis中的<foreach>标签是用于迭代集合或数组的元素,生成对应的SQL片段,以便在动态SQL中使用。

该标签通常用于循环处理参数集合,生成多个相同的SQL片段,以实现批量操作或动态条件查询。

其基本的语法如下:

<foreach collection="collectionName" item="itemName" index="indexName" open="(" close=")" separator=",">#{itemName}
</foreach>

对应的属性如下:(只有collection和item是必选,其他都是可选参数)

  • collection: 指定要迭代的集合或数组的属性名,表示传入的参数的数据类型。
    该属性是必须指定的,用于指定要进行foreach操作的对象。
  • item: 指定在迭代过程中每个元素的别名,表示本次迭代获取的元素。
    若collection为List、Set或者数组,则表示其中的元素;
    若collection为map,则代表key-value的value。
    该参数是必选的。
  • index: 指定在迭代过程中每个元素的索引,仅对集合有效。
    在遍历List时,index表示元素的索引;在遍历Map时,index表示Map的key。该参数是可选的。
  • open: 指定迭代开始时的字符串,最常用的是左括弧'('
    MyBatis会将该字符拼接到整体的SQL语句之前,并且只拼接一次。该参数是可选的。
  • close: 指定迭代结束时的字符串,最常用的是右括弧')'
    MyBatis会将该字符拼接到整体的SQL语句之后。该参数是可选的。
  • separator: 指定每次迭代之间的分隔符。
    在SQL语句中,用于分隔不同元素的值。例如,1,2,3之间的,。该参数是可选的。

2. Demo

下面是一个简单的例子,假设有一个包含多个用户ID的集合,我们想要生成一个SQL语句查询这些用户:

<select id="selectUsersByIds" resultType="User">SELECT * FROM usersWHERE id IN<foreach collection="userIds" item="userId" open="(" close=")" separator=",">#{userId}</foreach>
</select>

在这个例子中,userIds是一个包含用户ID的集合,<foreach>标签会生成类似于IN (id1, id2, id3)的SQL片段。

另外,如果使用MyBatis的动态SQL功能,可以在<if>标签内使用<foreach>,以根据条件动态生成SQL片段,以下是一个例子,假设有一个条件查询的场景,根据用户选择的角色列表进行查询:

<select id="selectUsersByRoles" resultType="User">SELECT * FROM users<where><if test="roles != null and roles.size > 0">AND id IN<foreach collection="roles" item="role" open="(" close=")" separator=",">#{role}</foreach></if></where>
</select>

在这个例子中,selectUsersByRoles是一个动态SQL查询,它根据用户传入的roles参数动态生成SQL条件。

  • 如果roles不为空且包含元素,那么<if>标签内的内容会生效,生成类似于AND id IN (role1, role2, role3)的SQL片段。
  • 如果roles为空或不包含元素,该条件会被忽略,从而生成不包含AND的SQL语句。

在实际应用中,这种动态SQL的使用可以根据不同的业务需求动态构建查询条件,使SQL语句更加灵活和可复用。

3. 实际例子

结合实战中的例子,讲解更加透彻

  • 批量插入,即列表中有多个元素,代码示例:
<insert id="saveForList" parameterType="java.util.List">INSERT INTO E_DEVICE_TEMP_ALARM_HIST(DEVICE_NAME, BATTERY_TEMP, SEND_TO_DRIVER, CREATE_TIME, UPDATE_TIME, SENDER, SUGGESTION)<foreach collection="temperatureAlarmHistList" item="temperatureAlarmHist" separator="union all" open="(" close=")">SELECT#{temperatureAlarmHist.deviceName, jdbcType=VARCHAR},#{temperatureAlarmHist.batteryTemp, jdbcType=VARCHAR},#{temperatureAlarmHist.sendToDriver, jdbcType=INTEGER},#{temperatureAlarmHist.createTime, jdbcType=DATE},#{temperatureAlarmHist.updateTime, jdbcType=DATE},#{temperatureAlarmHist.sender, jdbcType=VARCHAR},#{temperatureAlarmHist.suggestion, jdbcType=VARCHAR}FROM DUAL</foreach>
</insert>
  • 动态SQL语句,更新语句也同理:
<update id="removeRuleDetailByRuleId"  >update equipment_change_shifts_rule_detail set is_deleted = 1 where rule_id IN<foreach collection="ids" item="id" index="index" open="(" separator="," close=")">#{id}</foreach>
</update>
  • 结合if语句,且参数位置可以随意:
<select id="trees" resultMap="treeNodeResultMap">select id, parent_id, equipment_name as title, id as 'value', id as 'key',location from equipment_architecture where is_deleted = 0<if test="tenantId!=null">and tenant_id = #{tenantId}</if>and id in<foreach close=")" collection="ids" item="listItem" open="(" separator=",">#{listItem}</foreach>
</select>

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

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

相关文章

24年春招要来了,大学生第一次实习去大厂重要么?

春招要来了&#xff0c;大学生第一次实习去大厂重要么? 1.错峰实习。2.继任直招。3.优化简历&#xff0c;匹配优先。4. 善用新技术 先说一个暴论: 实习一定要去大厂&#xff0c;尤其是非头部院校的同学&#xff0c;你就算进去打螺丝&#xff0c;也要进大厂 关于我&#xff1a…

无需任何三方库,在 Next.js 项目在线预览 PDF 文件

前言&#xff1a; 之前在使用Vue和其它框架的时候&#xff0c;预览 PDF 都是使用的 PDFObject 这个库&#xff0c;步骤是&#xff1a;下载依赖&#xff0c;然后手动封装一个 PDF 预览组件&#xff0c;这个组件接收本地或在线的pdf地址&#xff0c;然后在页面中使用组件的车时候…

Linux部署 .netcore网站

1.下载ubuntu镜像&#xff0c;ubuntu-18.04.6-desktop-amd64.iso&#xff0c; 2.安装VM虚拟机 16.2.3 build 版本 3.安装镜像 4.开启ssh&#xff0c;<网上搜 balabala> 5.先安装ssh,然后重启ssh,检查ssh状态&#xff0c;都是正常&#xff0c;但是fianlshell总是无法登录。…

微店获得微店商品详情 API(micro.item_get)

要获取微店商品详情&#xff0c;你需要使用微店的 API&#xff08;应用程序接口&#xff09;。在微店的 API 中&#xff0c;有一个名为 micro.item_get 的接口&#xff0c;可以用于获取商品详情。 要使用 micro.item_get API&#xff0c;你需要按照以下步骤进行操作&#xff1…

基于bp神经网络的共享单车需求量预测

目录 摘要 BP神经网络参数设置及各种函数选择 参数设置 训练函数 传递函数 学习函数 性能函数 显示函数 前向网络创建函数 BP神经网络训练窗口详解 训练窗口例样 训练窗口四部详解 基于BP神经网络的租金预测 代码下载:基于bp神经网络的共享单车需求量预测(代码完整是,数据齐…

【python】08.面向对象编程基础

面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词&#xff0c;也经常有人问能不能用一句话解释下什么是"面向对象编程"&#xff0c;我们先来看看比较正式的说法。 "把一组数据结构和处理它们的方法组成对象&#xff08;object&#…

Redis入门-redis的五大数据类型+三种特殊的数据类型

前言&#xff1a;Redis有五大基本类型与三种特殊类型的介绍 Redis有五大基本类型&#xff1a;字符串&#xff08;string&#xff09;、哈希&#xff08;hash&#xff09;、列表&#xff08;list&#xff09;、集合&#xff08;set&#xff09;和有序集合&#xff08;sorted se…

大模型实战营Day4 XTuner大模型单卡低成本微调实战

FINETUNE简介 LLM下游应用中&#xff0c;增量预训练和指令跟随是经常会用到的两种微调模式 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#xff1a;高质量的对话&#xff0c;问答数据 为什么需要指令微调&#xff1f; 因为…

前端重置密码报错记录

昨天晚上&#xff0c;我写了重置密码的前端&#xff0c;测试的时候报错 今天上午&#xff0c;我继续试图解决这个问题&#xff0c;我仔细检查了一遍&#xff0c;前端没有问题 可以正常接收输入的数据并且提交 但是后端接收到的数据为空&#xff0c;后端接口也没有问题 但后端收…

大模型核心技术原理: Transformer架构详解

在大模型发展历程中&#xff0c;有两个比较重要点&#xff1a;第一&#xff0c;Transformer 架构。它是模型的底座&#xff0c;但 Transformer 不等于大模型&#xff0c;但大模型的架构可以基于 Transformer&#xff1b;第二&#xff0c;GPT。严格意义上讲&#xff0c;GPT 可能…

vscode无法自动补全

前提&#xff1a;安装c/c插件 c/c插件功能非常强大&#xff0c;几乎能满足日常编码过程中常用的功能&#xff1b;因为也包含自动补全的功能&#xff0c;开启方法如下&#xff1a; 文件->首选项->设置&#xff1a; 扩展->c/c->Intellisense&#xff0c;找到Intell…

C++多线程学习[三]:成员函数作为线程入口

一、成员函数作为线程入口 #include<iostream> #include<thread> #include<string>using namespace std;class Mythread { public:string str;void Test(){cout << str << endl;} }; int main() {Mythread test;test.str "Test";thr…

大数据-hive函数与mysql函数的辨析及练习-将多行聚合成一行

目录 1. &#x1f959;collect_list: 聚合-不去重 2. &#x1f959;collect_set(col): 聚合-去重 3. &#x1f959;mysql的聚合函数-group_concat 4. leetcode练习题 1. &#x1f959;collect_list: 聚合-不去重 将组内的元素收集成数组 不会去重 2. &#x1f959;collec…

var、let、const 之间的区别

var、let、const 之间的区别 var 在 ES5 中 , 顶层对象的属性和全局变量是等价的 , 用 var 声明的变量既是全局变量 , 也是顶层变量。 注意 : 顶层对象 , 在浏览器环境指的是 window 对 象 , 在 Node 指的是 global 对象 var a 10; console.log(window.a) // 10使用 var 声…

mac 上 ssh: connect to host localhost port 22: Connection refused

1。 问题 在搭建hadoop环境的时候 发现ssh localhost 在报错 2. 解决 打开系统设置 -> 共享 -> -> 在左边服务中选择 远程登录 注意红框这些选项慎重选择&#xff01;&#xff01;&#xff01; 修改后&#xff0c;在终端再次 ssh localhost 发现登录成功了 如果…

科大讯飞星火大模型接入API js 部分 接口 安装注意事项

下载以下链接例子运行程序 https://xfyun-doc.xfyun.cn/static%2F16968175055332330%2Fspark_js_demo.zip 官网给的说明 准备 1.在demo中填写APPID、APISecret、APIKey&#xff0c;可到控制台-我的应用-大模型页面获取 2.安装nodejs 本地运行 1.打开cmd&#xff0c;进入dem…

QT上位机开发(权限管理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果只是简单的工具软件&#xff0c;其实是没有权限管理这么一说的。比如说&#xff0c;串口工具、485工具之类的软件&#xff0c;其实根本不存在所…

MOOSE相关滤波跟踪算法(个人学习笔记)

MOOSE 论文标题 “Visual Object Tracking using Adaptive Correlation Filters” 原文地址 用滤波器对目标外观进行建模&#xff0c;并通过卷积操作来执行跟踪。 参考阅读&#xff1a; 目标跟踪经典算法——MOSSE&#xff08;Minimum Output Sum Square Error&#xff09…

聊天机器人之接入智能回复(四)

智能回复实现思路 目前市场上有许多大语言模型&#xff0c;他能帮助我们更好的解决问题或者陪伴我们聊天。最先兴起的就是OpenAI的ChatGPT&#xff0c;但是我们国内使用不太方便。所以这里我使用咱们国内的平台做一个简单展示。 首先这里咱们使用的是讯飞星火认知大模型&…

力扣题目超出时间限制,String和StringBuilder

2182. 构造限制重复的字符串 简单说下遇到的问题&#xff0c;代码就不细说了&#xff08;在最后&#xff09;&#xff0c;遇到只有超出时间限制的问题&#xff0c;然后看那案例真的无语&#xff0c;但再怎么计算我代码的时间复杂度&#xff0c;大概也就是O&#xff08;n&#…