文章首发于:clawhub.club


mybatis是通过foreach标签实现批量插入。在构建 IN 条件语句的时候,遍历集合。

foreach标签

官方示例

1
2
3
4
5
6
7
8
9
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>

属性介绍

  • collection:指定要遍历的集合:
  • list类型的参数会特殊处理封装在map中,map的key就叫list
  • item:将当前遍历出的元素赋值给指定的变量
  • separator:每个元素之间的分隔符
  • open:遍历出所有结果拼接一个开始的字符
  • close:遍历出所有结果拼接一个结束的字符
  • index:索引。遍历list的时候是index就是索引,item就是当前值
  • 遍历map的时候index表示的就是map的key,item就是map的值
  • 用#{变量名}就能取出变量的值也就是当前遍历出的元素

批量插入

Mapper.xml

1
2
3
4
5
6
7
8
9
<!--批量插入章节-->
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO t_chapter
(id, name, url,date_time,sort,number,serial_num)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id},#{item.name},#{item.url},#{item.dateTime},#{item.sort},#{item.number},#{item.serialNum})
</foreach>
</insert>

Mapper.java

1
2
3
4
5
6
/**
* 批量插入
*
* @param chapterList 章节
*/
void batchInsert(@Param("list") List<Chapter> chapterList);

@param(“list”)注解

如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 “param” 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2},这个是默认值。如果注解是 @Param(“person”),那么参数就会被命名为 #{person}。

当使用了@Param注解来声明参数时,使用 #{} 或 ${} 的方式都可以获取到参数。

参考

mybatis官网