MyBatis `<foreach>`

ops/2024/11/20 1:47:29/

概念:

在MyBatis的<foreach>元素中,collectionitemopencloseseparatorindex这些属性都有特定的含义,它们一起定义了如何迭代集合并为SQL语句生成相应的片段。下面是对这些属性的详细解释:

  1. collection:

    • 意义: 指定要遍历的集合或数组的名称。

    • 用途: 告诉MyBatis从哪个集合或数组中获取元素来构建SQL。

    • 示例: 如果你的参数是一个Map,并且你想遍历这个Map的键,那么你可以这样写:collection="map.keys"

      如果参数是一个List,那么你可以直接写:collection="list"

  2. item:

    • 意义: 指定每次迭代时的当前元素的变量名。

    • 用途: 在<foreach>标签内部,你可以使用这个变量来引用当前迭代到的元素。

    • 示例: 如果你的集合包含字符串,你可以写:item="str",然后在<foreach>内部使用${str}来引用当前字符串。

  3. open和close:

    • 意义: 这两个属性分别指定了生成的SQL片段的开始和结束字符串。

    • 用途: 当你想要包裹整个遍历生成的SQL片段时,这两个属性非常有用。

    • 示例: 对于一个IN子句,你可能会这样写:open="("close=")",这会生成一个被括号包裹的列表。

  4. separator:

    • 意义: 指定迭代过程中生成的每个元素之间的分隔符。

    • 用途: 当你想要把多个元素连接起来时,比如在IN子句中,你需要用逗号分隔不同的值。

    • 示例: 对于IN子句,你可以写:separator=",",这样每个值之间都会用逗号分隔。

  5. index:

    • 意义: 当遍历集合时,指定用于引用当前元素索引的变量名。

    • 用途: 对于某些集合,比如List或数组,你可能想要引用元素的索引(位置)。

    • 示例: 如果你正在遍历一个List,并且想要同时获取元素的值和它的索引,你可以写:index="idx"item="value",然后在<foreach>内部使用${idx}#{value}

这些属性通常一起使用,以便能够灵活地构建各种SQL语句片段。通过组合这些属性,你可以创建复杂的SQL语句,这些语句在运行时可以动态地根据输入数据变化。

理解

foreach `循环标志

collection、 拿到的集合。List 或 Map

index 集合中的每一个对象 的 下标 或 键

item、 集合中的每一个对象 的 值

open、 循环开始前

close、 循环结束后

separator 每层循环的分隔符

<foreach collection="list" item="user" separator=",">  (#{user.id}, #{user.name}, #{user.age})  
</foreach>  
​
<foreach collection="map.keys" item="key" separator=",">  ${key} = #{map[key]}  
</foreach>
​
<foreach collection="map" item="value" index="key" open="(" close=")"  separator=",">  ${key} = #{value}  
</foreach>

例子

下面我将给出几个使用MyBatis <foreach> 元素属性的具体例子,这些例子展示了如何根据提供的集合或数组动态构建SQL语句。

例子 1: 遍历集合插入多条记录

假设我们有一个用户列表,并且想要一次性插入这些用户到数据库中。

Mapper XML:

<insert id="insertUsers" parameterType="list">  INSERT INTO users (id, name, age)  VALUES  <foreach collection="list" item="user" separator=",">  (#{user.id}, #{user.name}, #{user.age})  </foreach>  
</insert>

在这个例子中,collection="list" 指定了我们要遍历的集合,item="user" 是每次迭代时当前元素的变量名。separator="," 表示每个插入的元组之间用逗号分隔。

例子 2: 使用IN子句查询数据

如果我们想要根据ID列表查询用户,我们可以使用IN子句。

Mapper XML:

<select id="selectUsersByIds" parameterType="list" resultType="User">  SELECT * FROM users  WHERE id IN  <foreach collection="list" item="id" open="(" close=")" separator=",">  #{id}  </foreach>  
</select>

在这个例子中,open="("close=")" 分别指定了IN子句的开始和结束括号。separator="," 表示每个ID之间用逗号分隔。

例子 3: 使用索引和值遍历Map

假设我们有一个Map,其中键是列名,值是对应的值,我们想要根据这个Map动态构建UPDATE语句。

Mapper XML:

<update id="updateUser" parameterType="map">  UPDATE users  <foreach collection="map" item="value" index="key" separator=",">  ${key} = #{value}  </foreach>  WHERE id = #{id}  
</update>

在这个例子中,collection="map" 指定了我们要遍历的Map,item="value" 是每次迭代时当前值的变量名,index="key" 是每次迭代时当前键的变量名。separator="," 表示每个字段的更新语句之间用逗号分隔。

例子 4: 遍历数组插入数据

如果我们有一个ID数组,并想要根据这些ID插入到另一个表中,可以这样做:

Mapper XML:

<insert id="insertRelatedIds" parameterType="int[]">  INSERT INTO related_ids (user_id)  VALUES  <foreach collection="array" item="id" separator=",">  (#{id})  </foreach>  
</insert>

在这个例子中,collection="array" 指定了我们要遍历的是数组。其他属性和之前例子中的用法相同。

这些例子展示了如何灵活地使用MyBatis的<foreach>元素来构建动态SQL语句。你可以根据实际需求调整collectionitemopencloseseparatorindex等属性的值。

例子 5: 批量插入数据

Integer insertBathData(@Param("tableName")String tableName,@Param("paramMap")Map<String,Object> paramMap,@Param("dataList")List<Map<String,Object>>dataList);
INSERT INTO ${tableName}
<foreach collection="paramMap.keys" item="key" open="(" close=")" separator="," >${key}
</foreach>  //遍历map的键
values
<foreach collection="dataList" item="map"   separator=",">//遍历list<Map<>><foreach collection="map"  item="value" open="(" close=")" separator=",">//遍历每个值#{value}</foreach>
</foreach>

效果:

INSERT INTO some_table (name, age)

VALUES (value1_for_name, value1_for_age), (value2_for_name, value2_for_age)


http://www.ppmy.cn/ops/17243.html

相关文章

李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!

近日&#xff0c;百度创始人、董事长兼首席执行官李彦宏在央视《对话》•开年说的访谈中指出&#xff1a;“基本上说以后其实不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 “未来的编程语言只会剩下两种&#xff0c;一种…

【React Router】快速使用

组件 index.js import React from react; import ReactDOM from react-dom/client; import App from ./App; import {BrowserRouter} from "react-router-dom";// 创建根实例 const root ReactDOM.createRoot(document.getElementById(root)); root.render(// his…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

FPGA ——Verilog语法示例

FPGA ——Verilog语法示例 多模块定义条件判断 多模块定义 genvar i ;generatefor (i0 ; i<8; ii1)beginxdc xdc_u(.d1 (d1 ) ,.d2 (d2 ) ,.d3 (d3 ));end endgenerate条件判断 generate beginif(DEBUG "ON")beginila ila_u(.clk(clk),.probe0({A1,A2,A3,A4}))…

基于nest框架的redis streams实现mq(bullmq)

官网文档地址&#xff1a;Documentation | NestJS - A progressive Node.js framework 0.队列简介 队列是一种强大的设计模式&#xff0c;可以帮助您处理常见的应用程序扩展和性能挑战。队列可以帮助您解决的一些问题示例如下: &#xff08;1&#xff09;平滑处理峰。例如&…

算法项目(9)—— 大模型实现PDF检索加QA

本文包含什么? 使用大语言模型进行多个PDF问答检索加QA.gradio实现的网页界面操作,全套代码以及代码介绍运行有问题? csdn上后台随时售后.项目说明 本项目实现使用大语言模型为核心,gradio框架,调用vicuna实现多个pdf QA 代码运行 python3 main.pyimport gradio as gr fr…

【MySQL】数据类型

1. MySQL中的数据类型 整数类型&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT 浮点类型&#xff1a;FLOAT、DOUBLE 定点数类型&#xff1a;DECIMAL …

虚良SEO怎么有效的对百度蜘蛛权重优化?

人们交换链接通常首先要问的是你BR值是多少&#xff1f;国内搜索引擎来说以百度马首是瞻&#xff0c;无论seo还是竞价都看重的是百度&#xff0c;那么针对百度权重的优化就特别重要了。其实&#xff0c;百度权重是民间的一种说法&#xff0c;百度官方并没有认同这个数值&#x…