news 2026/4/23 14:31:22

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:27:24

学生认证通道开启:免费获取LobeChat高级功能

学生认证通道开启&#xff1a;免费获取LobeChat高级功能 在AI技术加速渗透教育、科研与日常生活的今天&#xff0c;越来越多的学生开始尝试构建自己的智能助手——不是为了炫技&#xff0c;而是真正用它来写论文、读文献、学编程、做项目。但问题也随之而来&#xff1a;主流AI平…

作者头像 李华
网站建设 2026/4/22 18:58:03

LobeChat在线测评自动评分系统

LobeChat在线测评自动评分系统 在教育数字化转型加速的今天&#xff0c;高校与在线教育平台正面临一个共同难题&#xff1a;如何高效、公平地评估成千上万学生的开放式问答或论述题作答&#xff1f;传统人工批改耗时费力&#xff0c;而简单的关键词匹配又难以捕捉语义深度。随着…

作者头像 李华
网站建设 2026/4/13 3:25:15

基于单片机的无刷直流电机调速控制设计

2系统设计方案 2.1总体设计 本文基于stm32实现一种无刷直流电机调速系统&#xff0c;主要实现对无刷直流电机的精确调速控制、工作状态显示、便于操作的人机界面等。具体如下&#xff1a; 电机驱动与调速&#xff1a;通过MCU输出6路PWM信号&#xff0c;控制6路功率MOS管组成的驱…

作者头像 李华
网站建设 2026/4/21 19:26:33

LobeChat移动端访问体验优化方案

LobeChat移动端访问体验优化方案 在移动设备占据用户上网时长超过70%的今天&#xff0c;一个AI聊天应用能否在手机上“好用”&#xff0c;几乎直接决定了它的实际价值。尽管许多大模型前端界面设计精美、功能丰富&#xff0c;但一旦进入手机浏览器&#xff0c;往往暴露出生硬的…

作者头像 李华
网站建设 2026/4/23 14:31:14

Leetcode刷题日记14(131-140)

目录问题1&#xff1a;问题链接&#xff1a;问题描述&#xff1a;实例&#xff1a;代码&#xff1a;问题2&#xff1a;问题链接&#xff1a;问题描述&#xff1a;实例&#xff1a;代码&#xff1a;问题3&#xff1a;问题链接&#xff1a;问题描述&#xff1a;实例&#xff1a;问…

作者头像 李华
网站建设 2026/4/16 2:15:03

10章 数据共享操作 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

本地数据共享&#xff08;LDS&#xff09;是一种极低延迟、用于临时数据的RAM暂存器&#xff0c;其有效带宽至少比直接、无缓存的全局内存高出一个数量级。它允许工作组内的工作项之间共享数据&#xff0c;并用于保存像素着色器参数插值所需的参数。与只读缓存不同&#xff0c;…

作者头像 李华