如何在 Spring Data JPA 中更新或插入记录
您想知道如何使用 Spring Boot 更新现有记录或插入新记录吗?
这篇文章是给你的。
让我们想象以下场景:
-
我们有一位现有客户,因为电话号码错误而想要修改他的电话号码。
-
我们有一个全新的客户想要注册他的详细信息。
在我之前关于How To Create A Spring Boot REST API的一篇文章中,我们有以下方法:
public Customer saveCustomer(Customer savedCustomer) {
Customer customer = new Customer();
customer.setFirstName(savedCustomer.getFirstName());
customer.setLastName(savedCustomer.getLastName());
customer.setEmail(savedCustomer.getEmail());
customer.setPhoneNumber(savedCustomer.getPhoneNumber());
return customerRepository.save(savedCustomer);
}
进入全屏模式 退出全屏模式
上述方法仅涵盖场景 2。
我们可以重构这个方法来执行一个 upsert 操作。
#2 什么是 UPSERT 操作?
upsert 操作是一种数据库操作,如果值已经存在于数据库中,我们将更新现有行。否则,我们将新值保存到新行中。
#3。你如何做一个UPSERT?
为此,我们必须:
-
从 Customer 表中删除任何重复条目以避免出现
1062 - Duplicate Entry error。 -
我们将使用电子邮件来唯一识别客户。因此,使
email列唯一。
ALTER TABLE customer ADD UNIQUE (email);
进入全屏模式 退出全屏模式
- 重构
save()方法逻辑,使其检查数据库中是否存在条目。如果是,请更新现有条目。否则,创建一个新的并将其插入数据库。
public Customer saveCustomer(Customer savedCustomer) {
Customer customer = customerRepository
.findCustomerByEmail(savedCustomer.getEmail());
if(customer != null) {
customer.setFirstName(savedCustomer.getFirstName());
customer.setLastName(savedCustomer.getLastName());
customer.setPhoneNumber(savedCustomer.getPhoneNumber());
} else {
customer.setFirstName(savedCustomer.getFirstName());
customer.setLastName(savedCustomer.getLastName());
customer.setEmail(savedCustomer.getEmail());
customer.setPhoneNumber(savedCustomer.getPhoneNumber());
}
return customerRepository.save(customer);
}
public Optional<Customer> getCustomerByEmail(String email){
Customer customer = customerRepository.findCustomerByEmail(email);
return Optional.ofNullable(customer);
}
进入全屏模式 退出全屏模式
#3。在邮递员上测试
让我们通过 Postman 测试一下这个逻辑:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--iGpkkDqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/uploads/articles/qgu5ct51v6k4znyk162m.jpg)
记录也会在数据库中更新。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--MxK7DCr8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/uploads/articles/ukxqditdlv7asj8iprqr.jpg)
现在让我们尝试用不同的电话号码更新 Helena 的电话号码。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--GfugC7Hd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// /dev-to-uploads.s3.amazonaws.com/uploads/articles/1le5kx1px43oj0i4t8n2.jpg)
在数据库中,应更新 Helena 的电话号码(不应创建新行)。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--Hl3MeHqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https ://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gerjsj8x2anuy66k154.jpg)
结论
希望这篇文章对您有所帮助。
在下面的评论中留下任何问题/疑问。
直到下一次!
进一步阅读:
-
将 JPA 实体替换为 DTO。
-
Spring Boot 中的 PUT 和 PATCH 请求有什么区别?
更多推荐



所有评论(0)