news 2026/1/3 9:17:49

mybatis-动态sql语句-<foreach>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mybatis-动态sql语句-<foreach>

循环遍历集合/数组,把集合元素拼接成sql片段,

动态处理多个参数的场景

就比如:简单场景的:构建IN条件、批量查询用户列表、一次插入多个用户,多对多关联表等等

属性

属性作用
collection要遍历的集合/数组/Map的key
item当前元素的别名:比如遍历users的每个元素的别名是user
separator元素之间的分隔符(IN条件会用“,”隔开)
open开头拼接(In条件开头用加"(")
close结尾拼接(In条件结尾用加")")

collection

  1. 传入List集合:例如List<Integer> ids : 那就是 collection="list"
  2. 传入数组:例如Integer[] ids:那就是 collection="array"
  3. 传入Map:例如Map<String,List> map ,其中key是"ids",value是具体的id集合,那collection="ids"——填 Map的key值
  4. 如果用@Param注解指定参数名了
List<User> getAllByIds (@Param("ids") List<Integer> ids)

那就用@param注解里面的名字

例子(一看就懂)

  • 构建IN条件(查询多个id的用户)

List<User> selectByIds(@Param("ids") List<Integer> idList);
<select id="selectByIds" resultType="com.example.User"> SELECT * FROM user WHERE id IN <!-- 循环拼接 (1,2,3) --> <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} <!-- 这里的id是item指定的别名,对应集合中的每个元素 --> </foreach> </select>

最终生成的sql语句就是 (如果idList=[1,2,3])

SELECT * FROM user WHERE id IN (1,2,3)
  • 批量插入
int InsertUsers(@Param("users") List<User> userList);
<insert id="InsertUsers"> INSERT INTO user (name, age) VALUES <!-- 循环拼接 (name1,age1),(name2,age2) --> <foreach collection="users" item="user" separator=","> (#{user.name}, #{user.age}) <!-- user是User对象别名,可直接取属性 --> </foreach> </insert>

最终生成的sql (如果userList有两个用户)

INSERT INTO user (name, age) VALUES ('张三',20),('李四',22)
  • 批量插入角色-菜单关联关系

比如:给角色 ID=1 绑定菜单 ID=2、3、4,会一次性插入 3 条记录:(1,2)、(1,3)、(1,4),避免循环调用单条插入,效率更高。

int insertRoleMenu(Role role);//Role实体类里有roleId和menuId
<insert id="insertRoleMenu" parameterType="com.shenkong.entity.Role"> insert into t_role_menu(roleId, menuId) VALUES <foreach collection="menuIds" item="menuid" separator=","> (#{roleId, javaType=java.lang.Integer, jdbcType=INTEGER}, #{menuid, javaType=java.lang.Integer, jdbcType=INTEGER}) </foreach> </insert>

生成的sql语句

insert into t_role_menu(roleId, menuId) VALUES (1, 2), (1, 3), (1, 4)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/23 21:11:16

腾讯云国际站代理商的TAPD如何帮助企业进行研发管理?

腾讯云国际站代理商的 TAPD 本身具备覆盖研发全生命周期的管理功能&#xff0c;代理商还能结合企业跨境等业务场景提供定制化辅助&#xff0c;从需求管控、协作提效、质量保障等多方面助力企业规范研发管理&#xff0c;具体方式如下&#xff1a;全流程需求管控&#xff0c;把控…

作者头像 李华
网站建设 2025/12/24 6:31:43

技术博客征文比赛:围绕LobeChat写作赢取奖励

LobeChat&#xff1a;当开源遇见优雅&#xff0c;重塑AI聊天界面的边界 在大模型浪潮席卷全球的今天&#xff0c;我们早已不再惊讶于一个AI能写出诗、编出代码&#xff0c;甚至通过图灵测试。真正让人皱眉的是——为什么用起来还是这么别扭&#xff1f; 你费尽千辛万苦本地跑通…

作者头像 李华
网站建设 2025/12/24 4:40:15

python环境变量配置

如果电脑没有配置python环境变量的话cmd中执行python命令C:\Users\a1>where python C:\Users\a1\AppData\Local\Microsoft\WindowsApps\python.exeC:\Users\a1>pythonC:\Users\a1>会弹出让你下载。这就是没有配置python环境变量的现象。配置python环境变量&#xff0c…

作者头像 李华
网站建设 2025/12/24 15:55:59

libmodbus库解析方式完整版

1.库解析1.1首先在命令行&#xff08;cmd&#xff09;执行对 libmodbus 执行 cscript configure.js ----- >生成config.h的文件libmodbus-master\src\win32 找到之后&#xff0c;win r 输出cmd 进入bash&#xff0c; 输入d: 进入根目录 cd 整体\libmodbus-master\src\w…

作者头像 李华
网站建设 2025/12/24 17:37:43

基于PLC控制的城市污水处理系统

2 设计方案的确定 2.1 PLC的简介 PLC是一种以数字运算操作为基础的可编程逻辑控制器&#xff0c;其服务于大体量、高要求、环境恶劣、复杂程度高的工业环境。它采用一类可编程存储器&#xff0c;有着独特的内部存储程序、较强的逻辑运算、顺序控制、定时、记数与算数操作等用户…

作者头像 李华
网站建设 2025/12/25 3:59:24

整体设计 定稿 之 5 讨论问题汇总 和新建 表述总表/项目结构表 文档分析,到读表工具核心设计讨论(豆包助手)

摘要本次讨论聚焦第一阶段核心目标——“架构表读表工具”定版落地&#xff0c;对前期设计进行深化完善并确认落地可行性。首先&#xff0c;明确补充随动原则核心说明&#xff0c;将其作为架构表设计与读表工具开发的核心准则&#xff0c;界定唯一可定的视觉元素与表格形式规则…

作者头像 李华