一直在考虑一个问题,就是数据库插入的时候在java业务层是用for循环单条插入效率高还是直接一个List数据插入效率高,还是效率是一样的?
为此做了一个demo
两个测试请求
@RequestMapping(value = "/test/addForeach")
@ResponseBody
public String addForEach() {
Student student = new Student();
student.setAge(10);
student.setName("#zhangsan#");
student.setSex(1);
long s = System.currentTimeMillis();
for(int i=0; i<1000; i++) {
studentService.addStudent(student);
}
long e = System.currentTimeMillis();
System.out.println("Foreach Insert Takes: " + (e-s));
return "ok";
}
@RequestMapping(value = "/test/addList")
@ResponseBody
public String addList() {
Student student = new Student();
student.setAge(10);
student.setName("#zhangsan#");
student.setSex(1);
List studentList = new ArrayList();
long s = System.currentTimeMillis();
for(int i=0; i<1000; i++) {
studentList.add(student);
}
studentService.addStudentList(studentList);
long e = System.currentTimeMillis();
System.out.println("List Insert Takes: " + (e-s));
return "ok";
}
service层代码就简单的调用了mapper封装的接口
/**
* Created by mjchow
* Date 2016/2/21
* Time 15:53
*/
@Service
public class StudentServiceImpl implements StudentService {
@Resource
private StudentMapper studentMapper;
@Override
public void addStudent(Student s) {
studentMapper.insert(s);
}
@Override
public void addStudentList(List studentList) {
studentMapper.insertList(studentList);
}
}
mapper.xml文件
insert into student (id, name, age, sex)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER},
#{sex,jdbcType=INTEGER})
INSERT INTO student(id, name, age, sex)
VALUES
(#{item.id}, #{item.name}, #{item.age}, #{item.sex})
下面来看看分别插入1000天数据所花费的时间
以上可以看出循环单条插入的效率比较低
但是如果我把插入的放到业务逻辑代码放到Service层中,两种的运行的时间都是毫秒级别的,不清楚这是为什么?
@Override
public void addStudentList(List studentList) {
long s = System.currentTimeMillis();
for(Student student: studentList) {
;
}
studentMapper.insertList(studentList);
long e = System.currentTimeMillis();
System.out.println("Service List Insert Takes: " + (e-s));
}
@Override
public void addStudentListForeach(List studentList) {
long s = System.currentTimeMillis();
for(Student student: studentList) {
studentMapper.insert(student);
}
long e = System.currentTimeMillis();
System.out.println("Service Foreach Insert Takes: " + (e-s));
}
这里可以看出相差不了多少,但是List的插入比foreach插入效率稍微好一点