mybatis实现数据库批量插入
1、前言
当入参参数是一个list时,可以使用循环进行依次插入,这是比较简单得一种方法,当然,缺点也比较明显,就是插入速度比较慢,如果llist 中存在一万条数据,也就是说,需要进行循环一万次,进行一万次得insert,效率也会大打折扣。这时可以使用mybatis中得批量插入,一次性插入多条数据,在速度上会好很多
2、实现
xml文件
1 <insert id="userList" 2 insert into tb_user ( 3 username, 4 password 5 ) 6 values 7 <foreach collection="userList" item="user" separator=","> 8 ( 9 #{user.username}, 10 #{user.password}, 11 ) 12 </foreach> 13 </insert>
mapperr文件
int userList(@Param("userList") List<User> userList);
这边需要注意一下
mapper文件中 @paramsz中的参数需要和xml文件中forEach中的collection的参数相同,否则会抛出找不到参数的报错
3、mysql批量插入受参数配置限制的问题 max_allowed_packet
当批量插入数据量多大时,超过mysql默认的最大入参量,会抛出异常 :
\n### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (8,739,623 > 4,194,304)
由于mysql默认最大限制是4M(1024 * 1024 * 4),当大于这个阈值时,自然会报错
我这边是已经设置到64M了
常用的有这两种方法可以解决
1、修改配置文件
win系统下打开你的mysql的安装包路径,和bin同级可以看到有一个my.ini文件,在文件尾部加上 max_allowed_packet =67108864 即可
,linux 上一般都放在都放在 /etc/my.cnf 这个路径下,操作和win类似,使用ssh连接服务器之后 键入命令行 “Nano /etc/my.cnf” 即通过nano浏览my.cnf文件,在文件尾部加上max_allowed_packet =67108864 即可
修改完文件之后需要重启mysql服务才可以生效
2、命令行窗口键入(即使生效)
打开命令窗口 键入 mysql> set global max_allowed_packet = 1024 * 1024 * 500;
还可以使用Stream流将list进行分页存储,不过这种情况只适用于数据大小一致的情况下,可以判断list是否大于你设置的阈值
List<user> subList = list.stream().skip((long) (ipageNo- 1) * pageSize).limit(pageSize) .collect(Collectors.toList());
4、小结
配置文件设置过大的话,可能会影响插入的性能,修改配置文件这种事,还需慎重
设置为500M,也可能会崩溃掉,但是这种情况一般不会发生,毕竟,插入数据能够一次输入500M还是在少数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律