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 getAllByIds (@Param("ids") List ids)

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

例子(一看就懂)

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

java 复制代码
List<User> selectByIds(@Param("ids") List<Integer> idList);
XML 复制代码
<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)

sql 复制代码
SELECT * FROM user WHERE id IN (1,2,3)
  • 批量插入
java 复制代码
int InsertUsers(@Param("users") List<User> userList);
XML 复制代码
<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有两个用户)

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

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

java 复制代码
int insertRoleMenu(Role role);//Role实体类里有roleId和menuId
XML 复制代码
<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语句

sql 复制代码
insert into t_role_menu(roleId, menuId) 
VALUES 
(1, 2),
(1, 3),
(1, 4)
相关推荐
CQU_JIAKE1 小时前
11.7[高体】
java·后端·spring
apcipot_rain2 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A3 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白4 小时前
LangGraph4j 实战(下)
java
天诰5 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
freejackman8 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
这个昵称不容易8 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长9 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊10 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼10 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发