批量插入
1、循环调用SQL插入
性能问题,排除该方案。
2、SQL + 'foreach’标签
这个方案有两种写法:
- 第一种写法(推荐):
<insert id="insertBatch">
INSERT INTO tb_student (name, age, phone, address, class_id) VALUES
<foreach collection="list" separator="," item="item">
(#{item.name},#{item.age},#{item.phone},#{item.address},#{item.classId})
</foreach>
</insert>
- 第二种写法(不推荐):
<insert id="insertBatch">
<foreach collection="list" separator="," item="item">
INSERT INTO tb_student (name, age, phone, address, class_id) VALUES
(#{item.name},#{item.age},#{item.phone},#{item.address},#{item.classId})
</foreach>
</insert>
特点
- 如果传入的数据量太多,foreach 拼接成的SQL过长,有可能超过数据库允许的SQL最大长度而执行失败;
- 另外第二种写法有一些问题,比如:
- 相同的数据量,字段长度明显比第一中方法长,限制了每批次可以插入的数据量。
- 返回的值为0或1,指最后一条INSERT语句执行是否成功。就算中间的INSERT语句执行失败了,最后一条执行成功就不会抛出异常。导致Spring事务不会回滚
批量更新
目前Mybatis主流的批量更新操作主要有以下两种:
1、循环调用SQL更新
性能问题,排除该方案。
2、SQL+外层
通过在外层加一层循环,生成多个SQL update脚本。连接数据库一次性执行。
简单粗暴,也避免了多次连接数据库。
<update id="batchUpdateDbInfo">
<foreach collection="list" item="item" index="index" separator=";"