如何在 Spring Boot Restful 中更改大量数据(更新多个数据)

Posted

技术标签:

【中文标题】如何在 Spring Boot Restful 中更改大量数据(更新多个数据)【英文标题】:how to change a lot of data in Spring Boot Restful (Update Multiple data) 【发布时间】:2020-03-08 23:10:15 【问题描述】:
[I want this function to work, i.e. change a lot of data at once][1]

我想一次更改很多数据,怎么做?

在这个DAO下只改变一个数据,如果我想改变很多怎么办?

    @PutMapping("/roomstatus/update/id")
public ResponseEntity<RoomStatus> updatRoomStatus(@PathVariable(value="id") Integer empid,@Valid @RequestBody RoomStatus RsDetails)

    RoomStatus emp=roomStatusDAO.findOne(empid);
    if(emp==null) 
        return ResponseEntity.notFound().build();
    

    emp.setRoomNumber(RsDetails.getRoomNumber());
    emp.setFloor(RsDetails.getFloor());
    emp.setGuestName(RsDetails.getGuestName());
    emp.setRoomType(RsDetails.getRoomType());
    emp.setBedType(RsDetails.getBedType());
    emp.setRoomStatus(RsDetails.getRoomStatus());
    emp.setConditions(RsDetails.getConditions());

    RoomStatus updateRoomStatus=roomStatusDAO.save(emp);
    return ResponseEntity.ok().body(updateRoomStatus);                      

【问题讨论】:

使用@PatchMapping 【参考方案1】:

使用ModelMapper可以更改很多数据校验链接

https://www.appsdeveloperblog.com/java-objects-mapping-with-modelmapper/

或者

https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

【讨论】:

【参考方案2】:

如果您想完全更新您的资源,请使用@PutMapping 部分更新,请使用@PatchMapping。供参考检查here。

【讨论】:

【参考方案3】:

最简单的解决方案是作为@RequestBody RoomStatus 集合传递。

@PatchMapping("/roomstatus/update")
public ResponseEntity<RoomStatus> updatRoomsStatus(@Valid @RequestBody List<RoomStatus> rsDetails)
  List<RoomStatus> updated = rsDetails.stream().map(rs -> updateRoomStatus(rs)).collect(Collectors.toList());
  return ResponseEntity.ok().body(updated);


private RoomStatus updateRoomStatus(RoomStatus emp) 
  if(emp==null) 
    return ResponseEntity.notFound().build();
  
  emp.setRoomNumber(RsDetails.getRoomNumber());
  emp.setFloor(RsDetails.getFloor());
  emp.setGuestName(RsDetails.getGuestName());
  emp.setRoomType(RsDetails.getRoomType());
  emp.setBedType(RsDetails.getBedType());
  emp.setRoomStatus(RsDetails.getRoomStatus());
  emp.setConditions(RsDetails.getConditions());
  return roomStatusDAO.save(emp);

但要小心创建的堆大小 - 所有对象都可能非常重。 请注意that question - List 上传递的对象将不会被验证,因此您可以遵循这些答案。

PS.如果每个对象的修改都是相同的 - 只需要来自 RequestBody 的包含列表 od ID 和修改的自定义对象。然后从调用 DB 的 spring 数据调用自定义 JPQL 查询,而不是进行 n 次调用。

【讨论】:

【参考方案4】:

首先,您的问题不具体,表述不够好。

但据我了解,empId 是employeeId。 Employee 本身与 RoomStatus 具有一对多的关系。您的方法采用employeeId 和roomStatusDetails,并且对于与employeeId 关联的每个RoomStatus,您要设置roomStatusDetails。在这种情况下,您可以执行以下操作。 首先,在你的 roomStatusDAO 接口中添加一个方法来通过 empId:findAllByEmpId(Integer empId) 获取 RoomStatus 的集合,并在相应的类中提供其实现。 然后,解决方案将是这样的:

@PutMapping("/roomstatus/update/id")
public ResponseEntity<RoomStatus> updatRoomStatus(@PathVariable(value="id") Integer empid,@Valid @RequestBody RoomStatus RsDetails)    
   List<RoomStatus> updatedRoomStatuses = roomStatusDAO.findAllByEmpId(empid).stream().map(rs -> setRsDetailsAndSave(rs, RsDetails)).collect(Collectors.toList());
   return updatedRoomStatuses.isEmpty() ? ResponseEntity.notFound().build() : ResponseEntity.ok().body(updatedRoomStatus);                   


private RoomStatus setRsDetailsAndSave (RoomStatus rs, RoomStatus RsDetails) 
    rs.setRoomNumber(RsDetails.getRoomNumber());
    rs.setFloor(RsDetails.getFloor());
    rs.setGuestName(RsDetails.getGuestName());
    rs.setRoomType(RsDetails.getRoomType());
    rs.setBedType(RsDetails.getBedType());
    rs.setRoomStatus(RsDetails.getRoomStatus());
    rs.setConditions(RsDetails.getConditions());
    return roomStatusDAO.save(rs);

【讨论】:

以上是关于如何在 Spring Boot Restful 中更改大量数据(更新多个数据)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?

如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API

如何在spring boot中从restful控制器返回一个html页面?

Spring Boot + Spring Security Restful 登录

Spring Boot整合Swagger2构建RESTful API

Spring Boot:RESTful 控制器中的多层@Services 用于许多入站请求