当前位置: 首页 > news >正文

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)
http://www.zskr.cn/news/112591.html

相关文章:

  • 电子邮件营销模板:LobeChat编写个性化正文
  • LobeChat文件上传功能详解:图文混合输入不再是难题
  • LobeChat研究方向建议生成AI
  • 基于PLC控制的四路抢答器设计
  • 【Java SE 基础学习打卡】25 循环结构 - for
  • 自动化测试:Java+Selenium自动化测试环境搭建
  • 9、循环迭代与函数构建:脚本编程的核心技巧
  • LobeChat与IPFS结合实现去中心化聊天存档
  • Jmeter+Jenkins接口压力测试持续集成
  • 从 JavaScript 到 Python:前端工程师的完全转换指南
  • 在北京,寻找能聊创业、聊生活、一起向上的同行者
  • 3、Bash脚本编写:基础与进阶
  • LobeChat源码结构分析:快速二次开发入门路径
  • BONT-L肽有效成分:棕榈酰六肽-19 Palmitoyl Hexapeptide-19
  • LobeChat ISO27001体系建设建议
  • 别再问了!0基础转行网络安全完全可行,这份终极发展路线请收好
  • 别被“人才紧缺”迷惑!零基础小白入行网络安全的真实路径与避坑指南
  • 13、深入探索 GNOME 桌面环境的实用技巧与应用
  • 1、Linux网络管理与资源指南
  • Spring AI 2.x 发布:全面拥抱 Java 21,Redis 史诗级增强!
  • vscode copilot 不显示 claude sonnet 模型
  • Universal Key Programming: 2025 Autel AT100 Transponder Chip (10pcs/lot) for KM100, IM508, IM608
  • 百川大模型+BGE嵌入+LobeChat组合拳实战
  • 以太网为什么使用基带传输
  • Android系统DMS驾驶纪录之GPS组件追踪服务架构分析
  • 20. 指数函数和对数函数
  • vue3中computed计算属性和watch监听的异同点
  • LobeChat表单插件开发入门:为AI添加结构化输入
  • LobeChat快手内容推送策略
  • 纪念币预约自动化工具使用指南:告别手动抢购的烦恼