Java代码正在为每个数据运行选择和更新查询



我正在Spring JPA中编写一段Java代码,它可以在调用saveData函数时添加或更新数据。我想做的是,如果数据是新的,它会作为新记录添加到数据库中,否则它会被更新。

public void saveData(List<StudentTable> studentTableList){  
List< StudentTable > data= new ArrayList<>();
for(StudentTable dt: studentTableList){
if(dt.getStudentId() ==null) {
data.add(dt);
}else{
studentRepository.findById(dt.getStudentId()).map(
student->{
student.setFirstName(dt.getFirstName());
student.setLastName(dt.getLastName ());
student.setPhone(dt.getPhone());
student.setAddress(dt.getAddress());
return data.add(student);
});
}
studentRepository.saveAll(data);
data.clear();
}
}

虽然这段代码运行良好,但随着条目的增长,我看到了性能问题。我看到更新和选择查询是为表的每一行运行的,这降低了性能。

我想知道是否有任何方法可以只对那些在单个发布请求中更新或添加的行运行查询,或者提高性能?

每种情况下使用2块代码怎么样?

Student student = studentRepository.findById(dt.getStudentId());
if(student == null){
Student newStudent = new Student();
//add data
newStudent.save();
} else {
student.setFirstName(dt.getFirstName());
student.setLastName(dt.getLastName ());
student.setPhone(dt.getPhone());
student.setAddress(dt.getAddress());
student.update();
}

您可以按照@fladdimir提到的内容进行操作。或者,这是我的建议[不会提供任何代码,由您决定]:

  1. 在两个单独的列表中过滤旧对象[包含我从代码中看到的id]和新对象
  2. 列出所有ID
  3. 在映射中使用id <--> object作为keyValue
  4. 使用IN子句查询所有idList对象
  5. 现在,在地图的第二个代码块中设置值,并将其添加到列表中
  6. 将此列表与新的objectList合并
  7. 将它们与saveAll(your_merged_list(一起保存

我并不是说这是优化的方式,但至少你可以减少数据库的负载。

最新更新