Spring Data JPA 튜 토리 얼 시리즈

JPA 액세스 데이터 사용
프로젝트 생 성
IDEA 열기->새 프로젝트 만 들 기
디 렉 터 리 만 들 기
실체 만 들 기
package com.example.demo.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Customer {

    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    protected Customer() {
    }

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", firstName=" + firstName +
                ", lastName=" + lastName +
                '}';
    }
}

저장 소 만 들 기
실체 에 대응 하 는 Repository 만 들 기
package com.example.demo.repository;

import com.example.demo.entity.Customer;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface CustomerRepository extends CrudRepository {

    List findByLastName(String lastName);

}

계승CrudRepository을 통 해 몇 가지 첨삭 검사 방법 을 계승 하고 방법 명 지 를 통 해 다른 조회 방법 을 정의 할 수 있다.
로드 클래스 시작 CommandLine Runner 테스트 추가
package com.example.demo;

import com.example.demo.entity.Customer;
import com.example.demo.repository.CustomerRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringDataJpaDemoApplication {

    public static final Logger log = LoggerFactory.getLogger(SpringDataJpaDemoApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(SpringDataJpaDemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner demo(CustomerRepository repository) {
        return (args -> {

            repository.save(new Customer("Jack", "Bauer"));
            repository.save(new Customer("Chloe", "Brian"));
            repository.save(new Customer("Kim", "Bauer"));
            repository.save(new Customer("David", "Palmer"));
            repository.save(new Customer("Michelle", "Dessler"));

            log.info("Customer found with save() finish");

            log.info("Customer found with findAll()");
            log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
            for (Customer customer : repository.findAll()) {
                log.info(customer.toString());
            }
            log.info("");

            repository.findById(1L).ifPresent(customer -> {
                log.info("Customer found with findById()");
                log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                log.info(customer.toString());
                log.info("");
            });

            log.info("Customer found with findByLastName('findByLastName')");
            log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
            repository.findByLastName("Bauer").forEach(bauer -> {
                log.info(bauer.toString());
            });
            log.info("");

        });
    }


}

프로그램 실행,로그 로 효과 보기
REST 로 JPA 데이터 에 접근 하기
pom.xml 의존 도 추가


    
    
        
        
            org.springframework.boot
            spring-boot-starter-data-rest
        
        
    




실체 만 들 기
package com.example.demo.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    
    private String firstName;
    private String lastName;
    
    
    public String getFirstName() {
        return firstName;
    }
    
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    
    public String getLastName() {
        return lastName;
    }
    
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

저장 소 만 들 기
package com.example.demo.repository;

import com.example.demo.entity.Person;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import java.util.List;

@RepositoryRestResource
public interface PersonRepository extends PagingAndSortingRepository {
    
    List findPersonByLastName(@Param("name") String name);
    
}

이 reposcory 는 Person 대상 과 관련 된 여러 작업 을 수행 할 수 있 는 인터페이스 입 니 다.Spring Data Commons 에서 정의 한PagingAndSortingRepository인 터 페 이 스 를 계승 하여 이 동작 을 가 져 옵 니 다.
실행 할 때 Spring Data REST 는 이 인터페이스의 실현 을 자동 으로 생 성 합 니 다.그리고 스프링 MVC 를 사용 하여 RESTful 터미널/persons 를 만 들 도록 지도 합 니 다.
테스트 프로그램
우선 꼭대기 층 서비스 가 보 입 니 다.
curl http://localhost:8080/
{
  "_links" : {
    "customers" : {
      "href" : "http://localhost:8080/customers"
    },
    "persons" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile"
    }
  }
}

Spring Data REST 는 HAL 형식 으로 JSON 출력 을 진행 합 니 다.그것 은 매우 유연 해서 서비스 데이터 와 인접 한 링크 를 편리 하 게 제공 할 수 있다.
curl http://localhost:8080/persons
{
  "_embedded" : {
    "persons" : [ ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/persons"
    },
    "search" : {
      "href" : "http://localhost:8080/persons/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

customers 의 것 도 따라서 나타 나 는 것 을 볼 수 있 습 니 다.우 리 는 주석 을 통 해 숨 길 수 있 습 니 다.물론 전역 적 으로 숨 길 수도 있 습 니 다.
저장 소 검색 정책 설정
Spring Data REST@RepositoryRestResource를 사용 하여 저장 소 를 REST 자원 으로 내 보 낼 지 여 부 를 확인 합 니 다.의RepositoryDetectionStrategy열 거 는 다음 과 같은 값 을 포함한다.
Name
Description
DEFAULT
기본 값,ANNOTATION+VISIBILITY
ALL
모든 저장 소 공개
ANNOTATION
exported 가 false 로 설정 되 어 있 지 않 은 한@Repository RestResource 와@RestResource 주 해 를 공개 합 니 다.
VISIBILITY
모든 Public 수식 을 노출 한 Repository
설정 클래스 만 들 기
package com.example.demo.config;

import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.core.mapping.RepositoryDetectionStrategy;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
import org.springframework.stereotype.Component;

@Component
public class RestConfigurer implements RepositoryRestConfigurer {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.setRepositoryDetectionStrategy(RepositoryDetectionStrategy.RepositoryDetectionStrategies.ANNOTATED);
    }

}

테스트
curl http://localhost:8080/
{
  "_links" : {
    "persons" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile"
    }
  }
}

페이지 와 정렬
페이지 를 나누다RepositoryDiscoveryStrategies스프링 이 정의 하 는 인터페이스 로 PageRequest 를 실현 합 니 다.PageRequest 를 만 드 는 방법 을 보 여 줍 니 다.
Pageable pageable = PageRequest.of(0, 10);
Page page = repository.findAll(pageable);

//        

Page page = repository.findAll(PageRequest.of(0, 10));

첫 페이지 10 개의 데 이 터 를 요청 합 니 다.
만약 우리 가 다음 페이지 에 접근 하려 고 한다 면,우 리 는 매번 페이지 번 호 를 늘 릴 수 있다.
PageRequest.of(1, 10);
PageRequest.of(2, 10);
PageRequest.of(3, 10);
...

정렬
Spring Data JPA 는 하나의Pageable대상 에 게 정렬 체 제 를 제공 합 니 다.정렬 방식 을 봅 시다.
repository.findAll(Sort.by("fistName"));

repository.findAll(Sort.by("fistName").ascending().and(Sort.by("lastName").descending());

동시에 정렬 과 페이지 나 누 기
Pageable pageable = PageRequest.of(0, 20, Sort.by("firstName"));

Pageable pageable = PageRequest.of(0, 20, Sort.by("fistName").ascending().and(Sort.by("lastName").descending());

예시 대상 에 따라 조회 하 다
QueryByExampleExecutor
복잡 한 조회 구축
SpringData JPA 는'Domain Driven Design'의 규범 개념 을 실현 하기 위해 일부 열의 Specification 인 터 페 이 스 를 제공 했다.그 중에서 가장 자주 사용 하 는 것 은 Jpa SpecificationExecutor 이다.
SpringData JPA 를 사용 하여 복잡 한 조회(join 작업,모 으 기 작업 등)를 구축 하 는 것 은 모두 Jpa SpecificationExecutor 가 구축 한 Specification 에 의존 하 는 것 입 니 다.

좋은 웹페이지 즐겨찾기