MyBatis中foreach集合用法详解

在 MyBatis 中,<foreach> 标签用于遍历集合(Collection、List、Array、Map),常用于构建动态 SQL 语句(如 IN 查询、批量插入等)。以下是详细用法和示例:


核心属性

属性描述
collection必填:传入的集合参数名(或默认别名 list/array
item必填:遍历时元素的别名
index遍历的索引(List/Array 时为序号,Map 时为 key)
open循环开始时的字符串(如 (
close循环结束时的字符串(如 )
separator元素间的分隔符(如 ,

一、遍历 List/Array 的 4 种场景

1. 直接传入 List(默认别名 list

xml

复制

下载

运行

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

java

复制

下载

List<User> selectByIds(List<Long> ids); // 调用时传入 List
2. 使用 @Param 指定集合名

xml

复制

下载

运行

<foreach collection="ids" item="id" ...>  <!-- 使用自定义名称 -->

java

复制

下载

List<User> selectByIds(@Param("ids") List<Long> ids); // 指定参数名为 ids
3. 遍历 Array(默认别名 array

xml

复制

下载

运行

<foreach collection="array" item="item" ...>

java

复制

下载

List<User> selectByIdArray(Long[] idArray);
4. 遍历对象中的集合属性

java

复制

下载

public class QueryDTO {private List<Long> userIds;// getter/setter
}

xml

复制

下载

运行

<foreach collection="userIds" item="id" ...>  <!-- 直接使用属性名 -->

java

复制

下载

List<User> selectByDTO(QueryDTO dto);

二、遍历 Map 示例

xml

复制

下载

运行

<insert id="insertUsers">INSERT INTO user (name, age) VALUES<foreach collection="map" item="value" index="key" separator=",">(#{key}, #{value})  <!-- key=用户名, value=年龄 --></foreach>
</insert>

java

复制

下载

void insertUsers(@Param("map") Map<String, Integer> userMap); // key:name, value:age

三、批量插入(常用)

xml

复制

下载

运行

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

java

复制

下载

int batchInsert(@Param("users") List<User> users);

⚠️ 注意事项

  1. 集合为 null 时的处理
    若传入的集合为 null<foreach> 会报错。建议在 Java 代码中做空集合检查。

  2. 性能优化
    批量操作时,避免单次拼接过多 SQL(如超过 1000 条)。可分批执行:

    java

    复制

    下载

    for (int i = 0; i < users.size(); i += 200) {mapper.batchInsert(users.subList(i, Math.min(i + 200, users.size())));
    }
  3. 数据库方言差异
    部分数据库(如 Oracle)批量插入语法不同,需调整 SQL 结构:

    xml

    复制

    下载

    运行

    <!-- Oracle 批量插入示例 -->
    INSERT ALL
    <foreach collection="users" item="user">INTO user (name, email) VALUES (#{user.name}, #{user.email})
    </foreach>
    SELECT 1 FROM DUAL

完整示例:动态更新多个字段

xml

复制

下载

运行

<update id="updateUser">UPDATE user<set><foreach collection="updateMap" item="value" index="key" separator=","><if test="value != null">${key} = #{value}  <!-- 注意:字段名用 ${} 防注入需确保安全 --></if></foreach></set>WHERE id = #{userId}
</update>

java

复制

下载

void updateUser(@Param("userId") Long id,@Param("updateMap") Map<String, Object> fields // key=字段名, value=新值
);

通过灵活使用 <foreach>,可以高效处理集合型参数,简化动态 SQL 的编写。

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

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

相关文章

今日学习:ES8语法 | Spring整合ES | ES场景八股

文章目录 ES81 ES架构2 ES适用场景3 ES使用3.1对比mysql3.2 索引(Index)3.3 类型(Type)3.4 文档(Document)3.5 字段(Field)3.6 映射(Mapping) 4 ElasticSearch 基础功能4.1 分词器4.2 索引操作4.2.1 创建索引4.2.2 查看所有索引4.2.3 查看单个索引4.2.4 删除索引 4.3 文档操作4…

力扣刷题(第五十一天)

灵感来源 - 保持更新&#xff0c;努力学习 - python脚本学习 存在重复元素 II 解题思路 这个问题可以通过哈希表来高效解决。具体思路如下&#xff1a; 使用哈希表记录元素最后一次出现的位置&#xff1a;遍历数组&#xff0c;用一个哈希表存储每个元素的最后一次出现的…

基于 Vue3 + Element Plus 实现的智能题目生成页面设计思路

在本篇文章中&#xff0c;我将分享一个基于 Vue3 Element Plus 构建的「智能题目生成页面」的实现思路与设计理念。该页面作为在线学习平台的一部分&#xff0c;核心功能是&#xff1a;用户上传学习资料&#xff0c;AI 自动为其生成定制化题目。以下将从页面风格、功能模块、交…

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…

《P1801 黑匣子》

题目描述 Black Box 是一种原始的数据库。它可以储存一个整数数组&#xff0c;还有一个特别的变量 i。最开始的时候 Black Box 是空的&#xff0e;而 i0。这个 Black Box 要处理一串命令。 命令只有两种&#xff1a; ADD(x)&#xff1a;把 x 元素放进 Black Box; GET&#x…

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…

Server - 使用 Docker 配置 PyTorch 研发环境

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…

HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命​

​​CodeGenie&#xff1a;鸿蒙生态的AI编程革命​​ 华为推出的 ​​CodeGenie​​ 是集成于 DevEco Studio 的 AI 辅助编程工具&#xff0c;专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力&#xff0c;显著提升开发效率&#xff0c;降低鸿蒙生…

大模型模型部署和暴露接口

创建环境 激活案件 安装相关依赖 conda create -n fastApi python3.10 conda activate fastApi conda install -c conda-forge fastapi uvicorn transformers pytorch pip install safetensors sentencepiece protobuf 新建文件夹 mkdir App cd App touch main.py 复制代码…

Redis初入门

Nosql&#xff1a;Not-Only SQL&#xff08;泛指非关系型数据库&#xff09;&#xff0c;作为关系型数据库的补充 作用&#xff1a;应对基于海量用户和海量数据前提下的数据处理问题 redis&#xff1a;C语言开发的一个开源的高性能键值对数据库 特征&#xff1a; 1、数据之…

【原神 × 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密!

【原神 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密! 作者:星之辰 标签:#原神 #二叉树 #天赋树 #任务分支 #圣遗物强化 #算法科普 发布时间:2025年6月 总字数:6000+ 一、引子:提瓦特大陆的“树型奥秘” 你是否曾留意过《原神》角色面板的天赋树? 升级技能…

C++信息学竞赛中常用函数的一般用法

在C 信息学竞赛中&#xff0c;有许多常用函数能大幅提升编程效率。下面为你介绍一些常见函数及其一般用法&#xff1a; 一、比较函数 1、max()//求出a&#xff0c;b的较大值 int a10,b5,c;cmax(a,b);//得出的结果就是c等于10. 2、min()//求出a&#xff0c;b的较小值 int a1…

Linux【3】-----系统框架概述

系统架构 文件系统 linux一定需要挂载操作系统 一切皆文件 三个文件 引导文件 uboot.bin内核镜像 zImage文件系统镜像 system.img 设备树文件&#xff08;属于内核&#xff09; 应用程序编程 arm中通过软中断实现 各程序的构成 文件I/O 5种I/O模型 阻塞非阻塞信号多…

Tensorrt python api 10.11.0笔记

关于Tensorrt的python api文档阅读翻译加总结 文档源地址 Overview Getting started with TensorRT Installation(安装) 安装可参考:官方地址 Samples 关于样例的内容可参考:样例地址 Operator Documentation 有关更多信息&#xff08;包括示例&#xff09;&#xff0…

电镀机的阳极是什么材质?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;点击加入&#xff09;里的学员问&#xff1a;电镀的阳极有什么讲究&#xff1f;什么是可溶性阳极和非可溶性阳极&#xff1f; 什么是可溶性阳极与非可溶性阳极&#xff1f; 可溶性阳极 阳极本身就是…

前段三剑客之JavaScript-02

目录 简介 核心 函数 字符串对象 事件 运算符和控制语句 DOM 正则表达式 BOM JSON 简介 JavaScript由JavaScript语法&#xff0c;DOM和BOM组成 JS中提供了一些输入输出语句&#xff1a; alert(); //浏览器弹出警示框 console.log(); //控制台打印 prompt(); //浏览器…

Qiskit:量子计算模拟器

参考文献&#xff1a; IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算&#xff1a;基本概念常见的几类矩阵&#xff08;正交矩阵、酉矩阵、正规矩阵等&#xff09;Qiskit 安装指南-博客园使用Python实现量子电路模拟&#x…

【Elasticsearch】Elasticsearch 核心技术(二):映射

Elasticsearch 核心技术&#xff08;二&#xff09;&#xff1a;映射 1.什么是映射&#xff08;Mapping&#xff09;1.1 元字段&#xff08;Meta-Fields&#xff09;1.2 数据类型 vs 映射类型1.2.1 数据类型1.2.2 映射类型 2.实际运用案例案例 1&#xff1a;电商产品索引映射案…