循环遍历集合/数组,把集合元素拼接成sql片段,
动态处理多个参数的场景
就比如:简单场景的:构建IN条件、批量查询用户列表、一次插入多个用户,多对多关联表等等
属性
|------------|--------------------------------|
| 属性 | 作用 |
| collection | 要遍历的集合/数组/Map的key |
| item | 当前元素的别名:比如遍历users的每个元素的别名是user |
| separator | 元素之间的分隔符(IN条件会用","隔开) |
| open | 开头拼接(In条件开头用加"(") |
| close | 结尾拼接(In条件结尾用加")") |
collection
-
传入List集合:例如List<Integer> ids : 那就是 collection="list"
-
传入数组:例如Integer[] ids:那就是 collection="array"
-
传入Map:例如Map<String,List> map ,其中key是"ids",value是具体的id集合,那collection="ids"------填 Map的key值
-
如果用@Param注解指定参数名了
List<User> getAllByIds (@Param("ids") List<Integer> 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)