一 映射文件
<!-- 批量插入数据 -->
<insert id="addStudents" parameterType="java.util.List">
insert into student_101(name, age) values
<foreach collection="list" item="stu" index="index" separator=",">
(#{stu.name},#{stu.age})
</foreach>
</insert>
<!-- 普通插入 -->
<insert id="addStudent" parameterType="Student">
insert into student_101(name, age) values(#{name},#{age})
</insert>
二 测试用例
/**
* TODO 测试批量插入
*/
@Test
public void test_batchAdd(){
statement = namespace + "addStudents";
List<Student> studentList = this.createStudentList();
Long start = System.currentTimeMillis();
session.insert(statement,studentList);
Long end = System.currentTimeMillis();
System.out.println("批量插入" + studentList.size() + " 条数据耗时:" + (end - start));
//批量插入1000 条数据耗时:655
//批量插入2000 条数据耗时:879
//批量插入5000 条数据耗时:1993
//批量插入20000 条数据耗时:3148
//批量插入30000 条数据耗时:4535
}
/**
* TODO 测试普通插入
*/
@Test
public void test_normalAdd(){
statement = namespace + "addStudent";
List<Student> studentList = this.createStudentList();
Long start = System.currentTimeMillis();
for (Student student : studentList) {
session.insert(statement,student);
}
session.insert(statement);
Long end = System.currentTimeMillis();
System.out.println("普通插入" + studentList.size() + " 条数据耗时:" + (end - start));
//普通插入1000 条数据耗时:1906
//普通插入2000 条数据耗时:2738
//普通插入5000 条数据耗时:4824
//普通插入20000 条数据耗时:12908
//普通插入30000 条数据耗时:17610
}
三 总结
1. 相比普通插入方式,批量插入会有数倍的性能提升,同时大大减少了要执行的sql 语句,减轻了数据库压力
2. 但是在使用批量插入时,需要注意批量插入的数量有限,因为是做的字符串拼接,sql语句的长度是有限制的