Spring Data JPA 튜 토리 얼 시리즈
9950 단어 spring-data-jpaspring자바
프로젝트 생 성
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 에 의존 하 는 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Query By Example을 사용하여 SQL을 작성하지 않고 공백 무시 검색아래와 같이 검색 키워드 입력란이 다수 존재했을 때에, 컨트롤러측에서 if문을 사용해 경우 나누기를 하려고 하면 꽤 힘들게 되고, 코드가 더러워집니다. 거기서 조사한 바, SpringJPA의 「Query By Exa...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.