Spring Data JPA에서 레코드를 업데이트하거나 삽입하는 방법

4018 단어 javamysql
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 작업은 값이 데이터베이스에 이미 있는 경우 기존 행을 업데이트하는 데이터베이스 작업입니다. 그렇지 않으면 새 값을 새 행에 저장합니다.

    #삼. UPSERT는 어떻게 하나요?



    이렇게 하려면 다음을 수행해야 합니다.
  • 고객 테이블에서 중복 항목을 삭제하여 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 = new Customer();
                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);
        }
    
    


    #삼. 우편 배달부 테스트



    Postman을 통해 이 논리를 테스트해 보겠습니다.



    레코드도 데이터베이스에서 업데이트됩니다.



    이제 Helena의 전화번호를 다른 번호로 업데이트해 보겠습니다.



    데이터베이스에서 Helena의 전화번호가 업데이트되어야 합니다(새 행이 생성되지 않아야 함).



    결론

    이 기사가 도움이 되었기를 바랍니다.

    아래 의견에 질문/의심 사항을 남겨주세요.

    다음 시간까지!

    추가 읽기:
  • Replace A JPA Entity With A DTO .
  • What's the difference between a PUT and PATCH request in Spring Boot?
  • 좋은 웹페이지 즐겨찾기