mybatismysql批量insert数据_mysql数据库简介
2023-06-13 09:15:00 时间
大家好,又见面了,我是你们的朋友全栈君。
文章目录
前言
MySQL批量插入操作相较于单次循环插入有较大的优势,在特定场景下,有比较重要的应用价值。
一、MySQL批量插入的应用场景
我在做项目的时候遇到Excel导入基础数据的情况,在对Excel进行解析,并拿到Excel里面的数据之后,下一步是插入数据库。最简单的方式是使用单次循环插入,但是这种方法效率太慢,不具有事务特征,所以使用批量插入的方法。
二、实现过程
1、Controller层获得导入的Excel数据
代码如下(代码中的CourseInfoList就是一个List集合,存储着CourseInfo对象):
@PostMapping("/importCourse")
public AjaxResult importCourse(MultipartFile file) throws Exception{
GeneralListener<CourseInfo> generalListener = new GeneralListener<>();
EasyExcel.read(file.getInputStream(),CourseInfo.class,generalListener).sheet().doRead();
List<CourseInfo> courseInfoList = generalListener.getList();
courseService.insertCourseByBatch(courseInfoList);
return AjaxResult.success();
}
2、mapper.xml的SQL语句
service层和domain层就省略了。
- mapper.java代码如下:
@Mapper
public interface CourseInfoMapper {
void insertCourseByBatch(@Param("list") List<CourseInfo> list);
}
- mapper.xml代码如下:
<insert id="insertCourseByBatch" parameterType="java.util.List">
insert into course_info (id,courseNo,courseName, courseAttr, credit, totalHour, status, description)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{
item.id,jdbcType=BIGINT},#{
item.courseno,jdbcType=VARCHAR},#{
item.coursename,jdbcType=VARCHAR},#{
item.courseattr,jdbcType=VARCHAR},#{
item.credit,jdbcType=INTEGER},#{
item.totalhour,jdbcType=INTEGER},#{
item.status,jdbcType=INTEGER},#{
item.description,jdbcType=VARCHAR})
</foreach>
</insert>
这里遇到一个坑,网上很多博客在写这块的时候,都没有加上jdbcType,我一开始也没加,但是一直报错,后来加上jdbcType之后,才解决问题。
3、批量插入优点
- 批量插入效率比单次插入要高很多,能节省大约2/3的时间,原因在于:(1)降低了日志(MySQL的binlog和innodb的事务日志)刷盘的数据量和频率。(2)减少了SQL语句的解析次数。(3)、减少了网络传输的IO等。
- 操作的事务性。单次插入时,每个insert会开启一个事务,当执行很多insert的时候,会影响插入的性能。使用批量插入,可以在执行完成之后commit,保证了整批数据要么同时插入,要么都不插入。
- 批量插入有数据量的限制,即max_allowed_packet值,超过最大值会报错,但是一般情况下不会超过最大值,如果需要插入几十万条甚至上百万条数据,就需要对这种情况进行处理。
总结
这里对mybatis批量插入进行一个小的总结,本质上是将很多条待插入的数据拼接为一条SQL语句,再执行插入操作,在Excel导入等场景下是很有用的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185660.html原文链接:https://javaforall.cn
相关文章
- MySQL 数据库实现转移操作(mysql数据库转移)
- MySQL Status Connection_errors_select 数据库状态作用意思及如何正确
- MySQL下载指南:5步快速完成(mysql下载步骤)
- 如何删除MySQL服务?(mysql服务怎么删除)
- MySQL数据库:防御攻击的挑战(mysql数据库被攻击)
- MySQL导出数据库至TXT文件(mysql导出txt)
- MySQL数据库中分组数大于1的情况(mysql分组大于1)
- MySQL表空间查询:轻松掌握数据库大小(mysql表空间查看)
- Linux如何卸载MySQL数据库(linux怎么卸载mysql)
- MySQL事务日志:保证数据完整性的关键(mysql事务日志)
- MySQL: 开启日志记录功能的步骤指南(mysql开启日志)
- 比较MySQL与MS SQL:谁是最佳数据库之选?(mysql对比mssql)
- MySQL数据库导入SQL文件实现快速搭建(sql文件导入mysql数据库)
- MySQL中如何导入SQL文件(mysql如何导入sql文件)
- MySQL DDL命令,数据库进阶必知(mysql中ddl的命令)
- MySQL批量提交优化C语言编程效率(c mysql批量提交)
- 超强数据库检索基于多条件的MySQL查询(c mysql多条件查询)
- 使用ASP连接MySQL数据库,轻松实现功能扩展(asp连mysql数据库)
- 数据库ARM平台上实现MySQL数据库连接(arm平台连接mysql)
- 分别了解MySQL与Oracle的优势,比较选择合适的数据库(mysql换oracle)
- MySQL下载轻松获取高效数据库管理工具(mysql下载 na)
- MySQL数据库出现上翻问题,解决方法大全(mysql上翻了怎么办)
- MySQL怎么做不想为数据库表设置主键怎么办(mysql不想设置主键)