news 2026/5/19 8:23:41

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/5/15 23:46:41

LobeChat能否制作宣传视频?吸引更多用户

LobeChat&#xff1a;不只是聊天界面&#xff0c;更是AI产品的最佳展示窗口 在智能应用竞争日益激烈的今天&#xff0c;一个清晰、流畅且富有表现力的演示&#xff0c;往往比千言万语更能打动用户。尤其对于AI类产品而言&#xff0c;用户体验本身就是核心卖点——而LobeChat&am…

作者头像 李华
网站建设 2026/5/15 23:47:19

工业交换机vs商业交换机,有人物联网告诉你为何差的是千万成本

在某汽车零部件工厂的车间里&#xff0c;一次因商业交换机高温宕机导致的生产线停摆&#xff0c;直接造成30万元/小时的损失&#xff1b;而隔壁车间部署有人工业交换机的生产线&#xff0c;却在45℃高温、机械臂强震环境下连续365天无故障运行。看似仅“工业”与“商业”一字之…

作者头像 李华
网站建设 2026/5/15 8:55:44

基于单片机的汽车倒车测距器设计与实现

第2章 系统设计方案 2.1 总体设计 本系统采用 STC89C52 单片机作为主控制器&#xff0c;搭配 HC-SR04 超声波传感器实现距离测量功能。系统通过传感器实时采集车辆后方障碍物距离数据&#xff0c;经单片机处理后由 LCD1602 液晶显示屏进行可视化展示。同时&#xff0c;系统内置…

作者头像 李华
网站建设 2026/5/14 9:58:32

基于PLC交通信号灯控制

三、系统总体方案的设计 &#xff08;一&#xff09; PLC工作原理 它主要是通过执行用户程序来履行不同的控制功能。它主要在工业环境下使用&#xff0c;主要选择循环扫描的方法&#xff0c;一般分为4个阶段&#xff1a;第一阶段是初始化过程。PLC的输入信号没有直接连接到中央…

作者头像 李华
网站建设 2026/5/18 17:01:37

电子邮件营销模板:LobeChat编写个性化正文

电子邮件营销模板&#xff1a;LobeChat编写个性化正文 在数字营销的日常工作中&#xff0c;撰写一封既专业又打动人心的推广邮件&#xff0c;往往需要反复斟酌语气、结构和用户画像匹配度。而当企业面临成千上万的客户群体时&#xff0c;这种“一对一”的内容创作几乎成为不可能…

作者头像 李华
网站建设 2026/5/18 12:15:09

投资人关注点分析:LobeChat项目的商业化潜力

投资人视角下的 LobeChat&#xff1a;不只是聊天界面&#xff0c;而是 AI 时代的入口级中间件 在大模型能力“军备竞赛”日趋白热化的今天&#xff0c;一个有趣的现象正在发生&#xff1a;最抢眼的创新不再只来自底层模型公司&#xff0c;反而越来越多地出现在用户与模型之间的…

作者头像 李华