您想知道如何使用 Spring Boot 更新现有记录或插入新记录吗?

这篇文章是给你的。

让我们想象以下场景:

  1. 我们有一位现有客户,因为电话号码错误而想要修改他的电话号码。

  2. 我们有一个全新的客户想要注册他的详细信息。

在我之前关于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?

为此,我们必须:

  1. 从 Customer 表中删除任何重复条目以避免出现1062 - Duplicate Entry error

  2. 我们将使用电子邮件来唯一识别客户。因此,使email列唯一。

ALTER TABLE customer ADD UNIQUE (email);

进入全屏模式 退出全屏模式

  1. 重构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 测试一下这个逻辑:

[helena-post-request](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)

记录也会在数据库中更新。

[helena-costa-saved](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 的电话号码。

[helena-phone-number-updated](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 的电话号码(不应创建新行)。

[helena-phone-number-saved-db](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 请求有什么区别?

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐