- collection:必填,值为要迭代循环的属性名。这个属性值的情况有很多
- item :变量名,值为从迭代对象中取出来的每一个值
- index: 索引的属性名,在集合数组情况下值为当前索引值,当迭代循环的对象时Map类型时,这个值为map的key值
- open: 整个循环内容开头的字符串
- close:整个循环内容结尾的字符串
- separator: 每次循环的分隔符
- 只有一个数组参数或集合参数
- 当参数类型为集合的时候,默认会转换为map类型,并添加一个key为collection的值
- 如果参数类型是List集合,那么就继续添加一个key为list的值
- 当参数类型为数组的时候,也会转成map类型,默认的key为array
- 有多个参数
- 当有多个参数的时候,要使用@Param注解给每个参数指定一个名字,否则在SQL中使用参数时就会不方便。因此将collection设置为@Param注解指定的名字
- 参数时Map类型
- 使用Map和使用@Param注解方式类似,将collection指定为对应Map中的key即可
- 如果要循环所传入的Map,推荐使用@Param注解指定名字,此时可将collection设置为指定的名字
- 如果不想指定名字,就使用默认值_parameter
void saveUserRole(@Param("userSn") Long userSn, @Param("list") List<Long> list);
<insert id="saveUserRole">
insert into tb_user_role
(user_sn,role_sn)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{userSn},#{item})
</foreach>
</insert>
<insert id="insertList" useGeneratedKeys="true" keyProperty="id">
insert into sys_user
(user_name,user_password,user_email,user_info,head_img,create_time)
values
<foreach collection="list" item="user" separator=",">
#{user.userName},#{user.userPassword},#{user.userEmail},
#{user.userInfo},#{user.headImg,jdbcType=BLOB},
#{user.createTime,jdbcType=TIMESTAMP}
</foreach>
</insert>
<select id="selectByIdList" resultMap="userMap">
select
<include refid="userSql" />
from sys_user
<where>
id in
<foreach collection="list" open="(" close=")" separator=","
item="id" index="i">
#{id}
</foreach>
</where>
</select>
* 使用foreach批量更新
* @param map
void updateByMap(Map<String,Object> map);
<update id="updateByMap">
update sys_user
<foreach collection="_parameter" item="val" index="key" separator=",">
${key} = #{val}
</foreach>
</set>
where id=#{id}
</update>
foreach介绍collection:必填,值为要迭代循环的属性名。这个属性值的情况有很多item :变量名,值为从迭代对象中取出来的每一个值index: 索引的属性名,在集合数组情况下值为当前索引值,当迭代循环的对象时Map类型时,这个值为map的key值open: 整个循环内容开头的字符串close:整个循环内容结尾的字符串separator: 每次循环的分隔符参...
&amp;amp;amp;amp;amp;amp;amp;lt;insert id=&amp;amp;amp;amp;amp;amp;quot;batchDoubleForeachInsertTest&amp;amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;amp;amp;gt;
insert in
1、foreach标签
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update table_test
name = #{item.name},
date_updated =now()
where id= #{
最近做项目过程中,涉及到需要在
Mybatis 中 使用
foreach 进行循环读取传入的
查询条件,动态拼接SQL
语句,接口传入的
查询条件格式:{“advanceSearchList”:[{“searchType”:10,“searchText”:“12”}]} ,根据我定义的参数格式,需要在
Mybatis中动态去循环读取advanceSearchList 集合中的json对象,并根据 json对象中的searchType 做不同的处理,需要在
foreach 中嵌套 if 标签进行判断使用。
在【
Mybatis】功能强大的动态SQL之if与choose(03)中介绍了
Mybatis动态SQL的if用法,这一节将重点介绍
foreach的用法。
在实际的业务场景中,业务层通常会将
批量数据放入集合或者数组传给Dao层,并做相应的增删改查
操作,而
Mybatis可以利用
foreach元素来处理集合。
foreach实现
批量查询
在学习
foreach之前,先给大家回顾一下SQL
语句中的or和in的用法。
下面给出
查询语句需要用到的表数据,一共七条数据。
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了
foreach元素的属性主要有item,index,collection,open,separator,close。
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")"合用。.
<iftest="list!=null">
<
foreachcollection="list" item="item" index= "index" open="" close="" separator =";">
update XXX
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
<insert id="batchInsert" parameterType="java.util.List">
insert into USER (id, name) values
<foreach collect...
create table sql_test.on_duplicate_key_
update_employee
id int not null,
name varchar(20) null,
pa...
<update id="updateIsDelStatus" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";" close="" open="">
updat...
MyBatis 的 `foreach` 标签可以用来遍历集合,并为每个元素执行相同的 SQL 语句。在 `insert` 语句中使用 `foreach` 可以实现批量插入。
例如,在 MyBatis 的 XML 配置文件中,可以这样使用 `foreach` 标签来执行批量插入:
```xml
<insert id="insertUsers" parameterType="java.util.List">
insert into users (name, age)
values
<foreach collection="list" item="user" index="index" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
在这里,`foreach` 遍历了一个名为 `list` 的集合,并为每个元素执行了一次 `insert into users (name, age) values (#{user.name}, #{user.age})` 语句。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
14993