图1 方案1效率低,不建议采取
方案2:利用foreach批量插入(数据量不大时可以利用)既然一条一条插入效率较低,那可以采取批量插入的办法,该方案相对方案1紧张有2点改动:
1.首先将我们要插入的数据封装为一个List凑集,并对我们Dao层接口作一定改造,使其可以吸收一个List凑集;
2.其次我们对Mybatis mapper文件中的SQL进行改造,紧张利用Mybatis的<foreach>标签将传入的List凑集进行循环插入:
这种方案相对付第一种方案,插入性能有了大幅提升,事理便是Mybatis将insert语句
转换为
这样就让多条insert into插入语句变成了一条插入语句,可以带来性能上的提升,但也存在着两个问题:
(1)当插入的数据较多时,相称于拼接的sql语句会特殊的长,乃至超过sql语句的长度,一旦超出,就会抛出非常导致无法插入;
(2)当插入的数据较多时,也比较耗时。
方案3.利用foreach合营分片批量插入(数据量较大时推举利用)既然不能封装成一条SQL,那我们考虑有没有其他的办法,当然有,可以采取分片的办法。
紧张事理便是将list凑集按"指定长度"进行切分,返回新的List<List<T>>凑集。
这里分片的目的有两个:
1、批量插入,拼接的SQL语句过长,sql语句会有限定;
2、分片后采取stream多线程并行插入可以提高效率。
此外,不管是mysql还是oracle数据库,都可以利用分片进行插入。
总结总的来说,当实际业务场景数据量不是很大时,大家利用方案2就可以了,但插入数据量较大时,阿海还是推举大家利用方案3,可以大大提升插入效率。 在口试时,同学们可以着重讲讲方案3,相信口试官会对你刮目相看。