MySQL批量插入操作相较于单次循环插入有较大的优势,在特定场景下,有比较重要的应用价值。
我在做项目的时候遇到Excel导入基础数据的情况,在对Excel进行解析,并拿到Excel里面的数据之后,下一步是插入数据库。最简单的方式是使用单次循环插入,但是这种方法效率太慢,不具有事务特征,所以使用批量插入的方法。
代码如下(代码中的CourseInfoList就是一个List集合,存储着CourseInfo对象):
@PostMapping("/importCourse")
public AjaxResult importCourse(MultipartFile file) throws Exception{
GeneralListener generalListener = new GeneralListener<>();
EasyExcel.read(file.getInputStream(),CourseInfo.class,generalListener).sheet().doRead();
List courseInfoList = generalListener.getList();
courseService.insertCourseByBatch(courseInfoList);
return AjaxResult.success();
}
service层和domain层就省略了。
mapper.java代码如下:
@Mapper
public interface CourseInfoMapper {
void insertCourseByBatch(@Param(“list”) List list);
}
mapper.xml代码如下:
insert into course_info (id,courseNo,courseName, courseAttr, credit, totalHour, status, description) values (#{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})这里遇到一个坑,网上很多博客在写这块的时候,都没有加上jdbcType,我一开始也没加,但是一直报错,后来加上jdbcType之后,才解决问题。
这里对mybatis批量插入进行一个小的总结,本质上是将很多条待插入的数据拼接为一条SQL语句,再执行插入操作,在Excel导入等场景下是很有用的。