English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring Boot JPA 是用于管理的Java规范Java应用程序中的关系数据。它允许我们访问和持久化Java对象/类与关系数据库之间的数据。 JPA遵循객체 관계 맵핑(ORM)。它是一组接口。它还提供了运行时 EntityManager API는 데이터베이스 객체에 대한 쿼리와 트랜잭션을 처리하는 데 사용됩니다. 그것은 플랫폼에 상관없는 object-oriented query language인 JPQL(Java Persistence Query Language)를 사용합니다.
영구성 측면에서, 그것은 세 가지 영역을 포함합니다:
Java Persistence API Object-Relationalmetadata내부에 persistence 패키지에서 정의된 API 자체
JPA는 프레임워크가 아닙니다. 어떤 프레임워크에서나 구현할 수 있는 개념을 정의합니다.
JDBC와 비교할 때, JPA는 더 간단하고 깨끗하며 노동 INTENSe가 낮습니다. SQL과 수동 맵핑. JPA는 성능에 대한 주안이 없는 복잡한 애플리케이션에 적합합니다. JDBC와 비교할 때 JPA의 주요 장점은 JPA에서 데이터가 객체와 클래스로 표현되고, JDBC에서 데이터가 테이블과 레코드로 표현된다는 것입니다. 그것은 POJO를 사용하여 영구 데이터를 표현하여 데이터베이스 프로그래밍을 간소화합니다. JPA는 다른 장점들도 가지고 있습니다:
JPA는 SQL의 데이터베이스 전용方言을 사용하여 DDL(데이터 definition language)를 작성하지 않도록 허용합니다. 대신 XML이나 Java 애노테이션을 사용하여 맵핑을 허용합니다. JPA는 SQL의 데이터베이스 전용方言을 사용하여 DML을 작성하지 않도록 허용합니다. JPA는 Java 오브젝트와 그래픽을 저장하고 로드할 때 DML(데이터 manipulation language)를 사용하지 않도록 허용합니다.JPQL(Java Persistence Query Language)를 사용하여 쿼리를 실행해야 할 때, 우리는 Java 엔티티를 사용하여 SQL 테이블과 컬럼 대신 쿼리를 표현할 수 있습니다.
JPA는 다음과 같은 기능을 가집니다:
이는 강력한 저장소와 사용자 정의된객체 맵핑 추상화. 그것은 지원합니다.크로스 스토리지 영구성이는 하나의 엔티티가 MySQL과 Neo에서 부분적으로 저장될 수 있다는 의미입니다.4j(그래픽 데이터베이스 관리 시스템)에서.그것은 쿼리 메서드 이름에서 동적으로 쿼리를 생성합니다.도메인 기본 클래스는 기본 속성을 제공합니다.그것은 투명 감사를 지원합니다.사용자 정의 저장소 코드 통합 가능성.사용자 정의 네임스페이스와 쉽게 Spring Framework을 통합할 수 있습니다.
JPA는 비즈니스 엔티티를 관계적 엔티티로 저장하는 출처입니다. 그것은 POJO를 엔티티로 정의하고 관계를 통해 엔티티를 관리하는 방법을 보여줍니다.
아래 그림은 JPA의 클래스 레벨 아키텍처를 설명합니다. 이 아키텍처는 JPA의 핵심 클래스와 인터페이스를 설명합니다. javax persistence패키지. JPA 아키텍처는 다음과 같은 단위를 포함합니다:
Persistence: EntityManagerFactory 인스턴스를 얻기 위한 정적 메서드를 포함한 클래스입니다. EntityManagerFactory: EntityManager의 팩토리 클래스입니다. EntityManager의 여러 인스턴스를 생성하고 관리합니다. EntityManager: 그것은 인터페이스입니다. 그것은 객체에 대한 영구성 작업을 제어합니다. 그것은 Query 인스턴스에 적합합니다. @Entity는 클래스를: 实体是作为记录存储在数据库中的持久性对象。 Persistence Unit: : 엔티티는 데이터베이스에 기록으로 저장된 영구성 객체입니다. Persistence Unit: 입니다. 그것은 모든 엔티티 클래스의 집합을 정의합니다. 애플리케이션에서, EntityManager 인스턴스가 그것을 관리합니다. 엔티티 클래스의 집합은 단일 데이터 스토리지에 포함된 데이터를 나타냅니다.EntityManager와 EntityTransaction 간의 관계는그것은 EntityManager 클래스와 관계. 각 EntityManager에 대해, 작업은 EntityTransaction 클래스가 유지합니다. Query:
JPA 클래스 관계
입니다. 우리는 위에서 논의한 클래스와 인터페이스가 관계를 유지합니다. 아래 그림은 클래스와 인터페이스 간의 관계를 보여줍니다.EntityManager와 EntityTransaction 간의 관계는一对一 입니다. 각 EntityManager 작업은 EntityTransaction 인스턴스가 하나 있습니다.EntityManager와 Entity 간의 관계는EntityManageFactory와 EntityManager 간의 관계는 입니다. 이는 EntityManager 인스턴스의 팩토리 클래스입니다.EntityManager와 Entity 간의 관계는EntityManager와 Query 간의 관계는 입니다. 우리는 EntityManager 클래스의 인스턴스를 사용하여 여러 가지 쿼리를 실행할 수 있습니다.EntityManager와 Entity 간의 관계는一对多
JPA 구현 JPA는 오픈 소스 API입니다. Eclipse, RedHat, Oracle 등 다양한 기업 제공자가 JPA를 추가하여 새로운 제품을 제공합니다.流行的 JPA 구현 프레임워크로는 예를 들어 등으로도 알려져 있습니다. Hibernate, EclipseLink, DataNucleus 등으로도 알려져 있습니다.객체 관계 맵핑(ORM) 도구.
ORM에서, Java 객체와 데이터베이스 테이블 간의 맵핑(반대도 마찬가지)은객체 관계 맵핑. ORM 맵핑은관계형 데이터베이스(테이블과 레코드)과 Java 애플리케이션(클래스와 객체) 간의 다리.
아래 그림에서 보면, ORM 층은 어댑터 층입니다. 그것은 객체 그래프의 언어를 SQL과 관계형 테이블의 언어로 적응시킵니다.
ORM 층은 애플리케이션과 데이터베이스 사이에 존재합니다. 그것은 Java 클래스와 객체를 변환하여 관계형 데이터베이스에서 저장하고 관리할 수 있도록 합니다. 기본적으로, 영구화된 이름은 테이블 이름이 됩니다. 필드는 열이 됩니다. 애플리케이션이 구축되면, 각 테이블 행은 하나의 객체와 일치합니다.
EJB의 초기 버전은 비즈니스 로직 층과 결합된 영구 층을 정의했습니다. 사용 javax.ejb.EntityBean 接口。 EJB规范包括JPA的定义。
인터페이스 3인터페이스. EJB 스펙은 JPA 정의를 포함. 1EJB20에서, Persistance Layer는 분리되어 JPA로 지정되었습니다.60(Java Persistence API). 이 API의 스펙은 다음과 같이 함께发布.50011년 22월5일, JSR
20190의 JAVA EE 년, JPA는 다음과 같은 스펙과 함께 재명명되었습니다. Jakarta Persistence 2.2 JPA의 최신 버전은
다음 기능을 지원합니다: 8Java 데이터와 시간 APIAttributeConvertes에서 CDI注入
JPA와 Hibernate 간의 차이 JPA:
JPA는 데이터 접근, 관리 및 지속성 사이의 Java 객체와 관계형 데이터베이스를 처리하는 Java 스펙입니다. 이는 ORM의 표준 방법입니다. Hibernate:
이것은 관계형 데이터베이스 시스템에서 Java 객체를 저장하는 데 사용되는 가벼운 오픈 소스 ORM 도구입니다. 이는 JPA의 제공자입니다. 이는 JPA가 제공하는 일반적인 방법을 따릅니다.
다음 표는 JPA와 Hibernate 간의 차이를 설명. | JPA |
Hibernate JPA는 Java 애플리케이션에서 관계형 데이터를 맵핑하는. | Java 스펙 Hibernate은 데이터 지속성을 처리하는. |
ORM 프레임워크 | JPA는 구현 클래스를 제공하지 않음. |
그것은 구현 클래스를 제공. 그것은 다음과 같은 JPQL | (Java Persistence Query Language)이라는 플랫폼无关적인 쿼리 언어를 사용. 그것은 자신의 HQL |
그것은 다음과 같은 패키지에서 정의. 의 쿼리 언어(Hibernate 쿼리 언어). org.hibernate | 그것은 다음과 같은 패키지에서 정의. javax.persistence org.hibernate |
그것은 다음과 같은 패키지에서 정의. Hibernate, EclipseLink 그리고 다양한 ORM 도구에서 구현. | Hibernate은 JPA의제공자. |
JPA는 다음과 같이 사용 EntityManager 데이터의 지속성을 처리. | Hibernate에서는 다음과 같이 사용 세션 데이터의 지속성을 처리. |
Spring Boot 은 시작 프로그램 의존성을 제공 spring-boot-starter-data-jpa Spring Boot 애플리케이션을 효율적으로 사용하여 관계형 데이터베이스를 연결.-boot-starter-data-jpa 는 내부에서 spring 을 사용-boot-jpa 의 의존성.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.2.2.RELEASE</version> </dependency>
우리는 JPA를 통해 데이터베이스에 연결하는 Spring Boot 애플리케이션을 만듭니다. 다음 예제에서는 메모리 데이터베이스를 사용했습니다. Apache Derby
Apache Derby Apache Derby: 이것은 내장된 것입니다오픈 소스 소프트웨어 2관계형 데이터베이스는 완전히 Java로 구현되었습니다. Apache License
.0에서 사용할 수 있습니다. Apache Derby는 다음과 같은 장점을 가집니다:설치, 배포 및 사용이 간편합니다.그것은 Java, JDBC, SQL 표준을 기반으로 합니다.그것은 또한 Derby 네트워크 클라이언트 JDBC 드라이버와 Derby 네트워크 서버를 통해 클라이언트를 지원합니다./서버 모드.
Spring Boot는嵌入式 데이터베이스를 자동으로 구성할 수 있습니다. 예를 들어, H2HSQL,과 Derby 데이터베이스 우리는 연결 URL을 제공하지 않습니다. 사용할嵌入式 데이터베이스의 빌드 의존성만 포함하면 됩니다.
Spring Boot에서는 pom에 추가하면 됩니다. Derby 의존성을 추가하여 Apache Derby 데이터베이스를 쉽게 통합할 수 있습니다. xml 파일.
<dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <scope>runtime</scope> </dependency>
단계1: Spring Initializr https: 열기//start.spring.io/.
단계2: 가장 최신 버전의 Spring Boot를 선택 2.3.0(SNAPSHOT)
단계3: 제공Group이름. 우리는 다음을 제공했습니다: com.w3codebox.
단계4: 제공Artifact ID. 우리는 다음을 제공했습니다: apache-derby-예제 .
단계5: 의존성 추가: Spring Web, Spring Data JPA과 Apache Derby 데이터베이스.
단계6: 클릭 Generate (생성) 버튼을 클릭하면, 프로젝트를 Jar 파일로 패키징하고 로컬 시스템에 다운로드합니다。
단계7: 추출 Jar 파일을 STS 작업 공간에 붙여넣습니다。
단계8: 가져오기
파일-> 가져오기-> 현재 Maven 프로젝트-> 탐색->文件夹apache 선택-derby-예제-> 완료
데이터를 가져오는 데 시간이 걸립니다。
단계9: 의 폴더 src/main/java의 패키지에서 이름을 com.w3codebox.model 의 패키지에서 이름을
단계10: 의 패키지 com.w3codebox.model 의 패키지에서 이름을 UserRecord 의 클래스를 정의한 후 다음 작업을 수행합니다:
세 가지 변수 정의 id, name, and email.Getter와 Setter 생성.
파일을 오른쪽 클릭-> Source-> Generate Getter and Setters 기본 생성자 정의.애노테이션을 사용하여 로 표시.@Entity는 클래스를. 애노테이션을 사용하여 @Id는 Id prim키로 표시.
UserRecord.java
package com.w3codebox.model; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class UserRecord { @Id private int id; private String name; private String email; //default constructor public UserRecord() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
단계11: 내부에 src/main/java 폴더에 이름을 com.w3codebox.controller 의 패키지에서 이름을
단계12: 의 패키지 com.w3codebox.controller 의 패키지에서 이름을 UserController 의 Controller 클래스를 정의하고 다음 작업을 수행합니다:
애노테이션을 사용하여 @RestController 클래스를 컨트롤러로 표시.애노테이션을 사용하여 @Autowired 자동 연결 클래스 UserService .두 가지 맵핑을 정의했습니다. 하나는모든 사용자 가져오기다른 맵핑을 사용하여사용자 추가。
UserController.java
package com.w3codebox.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.w3codebox.model.UserRecord; import com.w3codebox.service.UserService; import java.util.List; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/") public List<UserRecord> getAllUser() { return userService.getAllUsers(); } @RequestMapping(value="/add-user, method=RequestMethod.POST) public void addUser(@RequestBody UserRecord userRecord) { userService.addUser(userRecord); } }
단계13: 의 폴더 src/main/java中创建一个名称为 com.w3codebox.service 의 패키지에서 이름을
단계14: 의 패키지 com.w3codebox.service 에서 이름을 UserController 的Service类,并执行以下操作:
通过使用注解 @Service将该类标记为服务。 自动连接 UserRepository 定义方法 getAllUsers(),该方法返回以下列表: 定义另一个方法名称 addUser(),以保存用户记录。
UserService.java
package com.w3codebox.service; import java.util.List; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.w3codebox.model.UserRecord; import com.w3codebox.repository.UserRepository; @Service public class UserService { @Autowired private UserRepository userRepository; public List<UserRecord> getAllUsers() { List<UserRecord>userRecords = new ArrayList<>(); userRepository.findAll().forEach(userRecords::add); return userRecords; } public void addUser(UserRecord userRecord) { userRepository.save(userRecord); } }
단계15: 의 폴더 src/main/java의 패키지에서 이름을 com.w3codebox.repository 의 패키지에서 이름을
단계16: 의 패키지 com.w3codebox.repository 에서 이름을 UserRepository 의 저장소 인터페이스를 확장하고 CrudRepository .
UserRepository.java
package com.w3codebox.repository; import org.springframework.data.repository.CrudRepository; import com.w3codebox.model.UserRecord; public interface UserRepository extends CrudRepository<UserRecord, String> { }
단계17: 지금, 다음을 열어주세요 ApacheDerbyExampleApplication.java 파일. 이는 우리가 애플리케이션을 설정할 때 기본적으로 생성된 파일입니다.
ApacheDerbyExampleApplication.java
package com.w3codebox; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ApacheDerbyExampleApplication { public static void main(String[] args) { SpringApplication.run(ApacheDerbyExampleApplication.class, args); } }
지금, 우리는 요구 사항에 따라 모든 필요한 클래스와 패키지를 설정했습니다. 주의하세요, 데이터베이스에 대한 어떠한 설정도 제공하지 않았습니다.연결 URL . 위의 모든 단계를 완료한 후, 프로젝트 디렉토리는 다음과 같습니다:
이제 이 애플리케이션을 실행해 보겠습니다.
단계18: 0: ApacheDerbyExampleApplication.java 파일을 열고 Java 애플리케이션으로 실행합니다.
제19단계: 브라우저를 엽니다. URL http:을 호출하십시오://localhost:8080/. 목록에 추가된 사용자가 없으므로 비어 있는 목록이 반환됩니다.
데이터베이스에 사용자를 추가하려면, 다음을 사용합니다.보내기 POST Postman 요청.
단계2. 0:열기Postman
를 선택하고 다음과 같은 작업을 수행하십시오: POST URL http:을 호출//localhost:8080/add-user.클릭Body Content를 선택-Type으로JSON (application/json)데이터베이스에 삽입할 데이터를 삽입합니다. 삽입한 데이터는 다음과 같습니다:
{ "id": "00"1", "name": "Tom", "email": "[email protected]" }
클릭보내기버튼
우리가 "보내기" 버튼을 클릭할 때, 이를 표시합니다상태: 200 OK . 이는 요청이 성공적으로 실행되었다는 것을 의미합니다.
단계21: 브라우저를 엽니다. URL http:을 호출하십시오: //localhost: 8080. 이는 우리가 데이터베이스에 삽입한 사용자를 반환합니다.