如何在 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 登录