Spring data jpa为减少查询数据库次数,先将符合条件的数据查出来,返回的是一个list集合,遍历集合将数据装入map中,根据需要设置key,value,然后判断map是否包含某个key或者value以此判断数据是否在数据库中已经存在。这样减少了访问数据库的次数,减小了服务器压力,将大部分操作放进了内存中进行。
最后: 一定要记住,除非没有其他方法实现,否则一定不要把增删改查写在for循环里面,数据量一大,其速度可想而知。
以下是我项目中的一个修改方法:
/**
* @param memberInfoList
*/
@Override
public void modify(List<StockMemberInfo> memberInfoList,Unit unit) {
SimpleSpecificationBuilder<StockShare> builder = new SimpleSpecificationBuilder<>();
builder.add("unit", SpecificationOperator.Operator.eq.name(), unit.getId());
List<StockShare> stockShareList = stockShareService.findList(builder.generateSpecification(),null);
Map<String, StockShare> map = new HashMap<>(16);
SimpleSpecificationBuilder<StockMemberInfo> builder2 = new SimpleSpecificationBuilder<>();
builder2.add("unitCode", SpecificationOperator.Operator.likeL.name(), unit.getUnitCode());
List<StockMemberInfo> stockMemberInfoList = stockMemberInfoService.findList(builder2.generateSpecification(), null);
Map<String, StockMemberInfo> memberInfoMap = new HashMap<>(16);
List<StockMemberInfo> list = new ArrayList<>();
for (StockShare stockShare : stockShareList) {
map.put(stockShare.getStockCategory().getName(),stockShare);
}
for (StockMemberInfo stockMemberInfo : stockMemberInfoList) {
memberInfoMap.put(stockMemberInfo.getUniqueField(), stockMemberInfo);
}
for (StockMemberInfo stockMemberInfo : memberInfoList) {
if (map.get(stockMemberInfo.getStockShare().getStockCategory().getName()) == null) {
throw new RuntimeException("你还未进行份额计算");
}
String uniqueField = stockMemberInfo.getMemberInfo().getId()+"-"+map.get(stockMemberInfo.getStockShare().getStockCategory().getName()).getId();
if (memberInfoMap.containsKey(uniqueField)) {
StockMemberInfo s = memberInfoMap.get(uniqueField);
s.setStockNum(stockMemberInfo.getStockNum());
list.add(s);
}
}
stockMemberInfoService.save(list);
}