public class Student {
private Integer id;
private String name;
private Integer age;
private Integer sex;
}
@Mapper
public interface StudentDao {
// 单条插入
int insert (Student student);
//批量插入
int inserts (@Param("students") List<Student> students);
}
3.1 用for循环进行批量插入
// 第一种 用for循环
// 先构造10万条数据
List<Student> students =new ArrayList<>();
for(int i=100000;i<=200000;i++){
Student student =new Student();
student.setId(i);
student.setName("学生"+i);
student.setAge(18);
student.setSex(0);
students.add(student);
}
Long start =System.currentTimeMillis();
// 用for循环一条一条的插入
for(Student student:students){
studentDao.insert(student);
}
System.out.println(System.currentTimeMillis()-start);
xml
<insert id="insert" parameterType="com.example.myproject.entity.Student">
INSERT INTO student (id, name, age,sex)
VALUES(#{id}, #{name}, #{age},#{sex})
insert>
耗时368645(和机器有关)
3.2 第二种 用sqlsession 批量插入
@Autowired
SqlSessionTemplate sqlSessionTemplate;
@Test
void mytest2() {
// 先构造10万条数据
List<Student> students =new ArrayList<>();
for(int i=200001;i<=300000;i++){
Student student =new Student();
student.setId(i);
student.setName("学生"+i);
student.setAge(18);
student.setSex(0);
students.add(student);
}
// 拿到sqsession,设置批量
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
// sqlSession创建Mapper对象,必须
StudentDao studentDao1 =sqlSession.getMapper(StudentDao.class);
Long start =System.currentTimeMillis();
for(Student student:students){
// 此时并没有提交
studentDao1.insert(student);
}
// 一次提交
sqlSession.commit();
System.out.println(System.currentTimeMillis()-start);
// 记得关闭sqlsession
sqlSession.close();
}
xml和前面一样
<insert id="insert" parameterType="com.example.myproject.entity.Student">
INSERT INTO student (id, name, age,sex)
VALUES(#{id}, #{name}, #{age},#{sex})
insert>
耗时322568(和机器有关)
3.3用foreach
// 构造10万条数据
List<Student> students =new ArrayList<>();
for(int i=300001;i<=400000;i++){
Student student =new Student();
student.setId(i);
student.setName("学生"+i);
student.setAge(18);
student.setSex(0);
students.add(student);
}
Long start =System.currentTimeMillis();
// 批量插入
studentDao.inserts(students);
System.out.println(System.currentTimeMillis()-start);
xml
<insert id="inserts" parameterType="java.util.List">
INSERT INTO student
(id, name, age,sex)
VALUES
<foreach collection ="students" item="student" separator =",">
(#{student.id}, #{student.name}, #{student.age}, #{student.sex})
foreach >
insert>
耗时4416(和机器有关)
通过三种方式的对比,我们可以看到用foreach是最快的,但是需要注意的是
foreach方式能够批量执行的数量是有限的,这个和mysql的允许的SQL语句的长度,以及批量上传的速度有关,用for循环每一次都与数据库进行连接和断开连接非常消耗资源不建议使用,用sqlsession是一种比较好的方式,具体情况看自己的需求。