English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spring Boot JPA

JPAとは何ですか?

Spring Boot JPA Javaアプリケーション内で管理するためのJava規格です関係データにアクセスし、Javaオブジェクトを永続化することができます/クラスと関係データベース間のデータを提供します。JPAはオブジェクト関係マッピング(ORM)。それは一組のインターフェースです。それにより、運行時 EntityManager データベースオブジェクトに対するクエリとトランザクションを処理するAPI。JPQL(Java持久クエリ言語)を使用して、プラットフォームに依存しない面向对象的クエリ言語を提供します。

持久性の面では、以下の3つの領域をカバーしています:

Java持久性API Object-Relationalメタデータ persistence パッケージで定義されたAPI自体

JPAはフレームワークではありません。どのフレームワークでも実現できる概念を定義しています。

なぜJPAを使用するべきですか?

JDBCと比較して、JPAはよりシンプルでクリーンで労働強度が低く、SQLや手書きのマッピングが少ないため、パフォーマンスに依存しない複雑なアプリケーションに適しています。JDBCと比較して、JPAの主な利点は、JPAではデータがオブジェクトとクラスで表され、JDBCではデータがテーブルやレコードで表されることです。JPAはPOJOを使用してデータベースのデータを表現することで、データベースプログラミングを簡素化します。JPAには他にも利点があります:

JPAはSQLのデータベース固有の方言を使用してDDLを避けます。代わりに、XMLやJavaアノテーションを使用してマッピングを許可します。 JPAはSQLのデータベース固有の方言を使用してDMLを書かないことを避けます。 JPAはJavaオブジェクトやグラフを保存および読み込むためにDML言語を全く使用しないことができます。JPQL(Java持久クエリ言語)を使用して、JavaエンティティでSQLテーブルや列ではなくクエリを実行する必要がある場合、JPAが私たちに許可します。

JPA機能

JPAには以下の機能があります:

これは強力なリポジトリとカスタムのオブジェクトマッピング抽象 サポートしています。クロスストアの永続性これは、1つのエンティティがMySQLとNeoの間で部分保存できることを意味しています。4j(グラフデータベース管理システム)中で。クエリメソッドの名前から動的にクエリを生成します。ドメインベースのクラスは基本的な属性を提供します。透明な監査をサポートしています。カスタムリポジトリコードの統合可能性があります。カスタムネームスペースを使用してSpring Frameworkと簡単に統合できます。

JPAアーキテクチャ

JPAはビジネスエンティティを関係エンティティとして保存するソースです。POJOをエンティティとして定義する方法と、関係を通じてエンティティを管理する方法を示しています。

以下の図はJPAのクラスレベルアーキテクチャを説明しており、JPAの核心クラスとインターフェースを示しています。 javax持久性パッケージ。JPAアーキテクチャは以下のユニットを含んでいます:

Persistence: これはEntityManagerFactoryインスタンスを取得するための静的メソッドを含むクラスです。 EntityManagerFactory: これはEntityManagerのファクトリークラスです。EntityManagerの複数のインスタンスを生成し管理します。 EntityManager: これはインターフェースです。オブジェクトに対する永続性操作を制御します。Queryインスタンスに適しています。 Entity: 実体はデータベースに記録として保存される持続可能なオブジェクトです。 Persistence Unit: これはすべてのエンティティクラスを定義します。アプリケーションでは、EntityManagerインスタンスがこれらを管理します。エンティティクラスのセットは、単一のデータストレージに含まれるデータを表します。 EntityTransaction: それとEntityManagerクラスとの関係は一对一関係。各EntityManagerに対して、操作はEntityTransactionクラスが維持します。 Query: このインターフェースは、各JPAサプライヤーが条件に適した関係オブジェクトを取得するために実装します。

JPAクラス関係

私たちが先ほど議論したクラスとインターフェースは関係を持ちます。以下の図はクラスとインターフェースの関係を示しています。

EntityManagerとEntityTransactionの関係は一对一。各EntityManager操作にはEntityTransactionインスタンスがあります。 EntityManageFactoryとEntityManagerの関係は一对多。これはEntityManagerインスタンスのファクトリークラスです。 EntityManagerとQueryの関係は一对多。EntityManagerクラスのインスタンスを使用して、任意の数のクエリを実行できます。 EntityManagerとEntityの関係は一对多。EntityManagerインスタンスは複数のエンティティを管理できます。

JPA実装

JPAはオープンソースAPIです。Eclipse、RedHat、Oracleなどのさまざまな企業サプライヤーが、その中にJPAを追加して新产品を提供しています。JPA実装フレームワークの人気のあるものには、 Hibernate、EclipseLink、DataNucleus などと呼ばれます。また、オブジェクト関係マッピング(ORM)ツール。

オブジェクト関係マッピング(ORM)

ORMでは、Javaオブジェクトとデータベーステーブルの間のマッピング(逆も然り)をオブジェクト関係マッピング。 ORMマッピングは関係データベース(テーブルとレコード)および Javaアプリケーション(クラスとオブジェクト)の橋渡し。

以下の図に示されるように、ORMレイヤーはアダプタレイヤーです。オブジェクトグラフの言語をSQLおよび関係テーブルの言語に適応させます。

ORMレイヤーはアプリケーションとデータベースの間に存在します。Javaクラスとオブジェクトを変換し、関係データベースで保存および管理するためのものです。デフォルトでは、永続化された名前はテーブルの名前になり、フィールドは列になります。アプリケーションが構築されると、各テーブル行はオブジェクトに対応します。

JPAバージョン

EJBの初期バージョンでは、ビジネスロジックレイヤーと結びついた永続層が定義されていました。使用 javax.ejb.EntityBean インターフェース。 EJB規格にはJPAの定義が含まれています。

EJBの導入 30時、持久層は分離され、JPAとして指定されました 10(Java Persistence API)。このAPIの規格は以下とともに公開されました2のJAVA EE6005年11月 22日、JPAはJSR50のJAVA EE

2019規格 年、JPAは以下とともに再命名されました Jakarta Persistence 2.2 。 JPAの最新バージョンは

。それが以下の機能をサポートします: 8Java 、データと時間APIAttributeConverters中的CDI注入

それは注釈@RepeatableのCDI注入を可能に

JPAとHibernateの違い JPA:

JPAはJava規格で、データのアクセス、管理、持続可能性の間でJavaオブジェクトとリレーショナルデータベースを統合するために使用されます。これはORMの標準方法です。 Hibernate:

これは軽量のオープンソースORMツールで、リレーショナルデータベースシステムにJavaオブジェクトを保存するために使用されます。それは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スタートアップデータJPA

Spring Bootはスタートアップ依存関係を提供 spring-ブート-スターター-データ-jpa Spring Bootアプリケーションを効率的にリレーショナルデータベースを使用するために。-ブート-スターター-データ-jpaは内部でspringを使用-ブート-jpa依存関係。

<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-ブート-スターター-データ-jpa</artifactId>  
<version>2.2.2.RELEASE</version>  
</dependency>

Spring Boot JPAサンプル

私たちはJPAを使用してデータベースに接続するSpring Bootアプリケーションを作成しました。以下の例では、メモリデータベースを使用しています。 Apache Derby。

Apache Derby : これはインラインのものですオープンソースソフトウェアリレーショナルデータベースは完全にJavaで実装されています。それはApache Licenseで公開されています。 2.0で利用可能です。Apache Derbyには以下の利点があります:

インストール、デプロイ、使用が簡単です。Java、JDBC、SQL標準に基づいています。それにより、DerbyをJavaベースのどのソリューションにも埋め込むことができます。さらに、Derby Network Client JDBCドライバーとDerby Network Serverを通じてクライアントをサポートしています。/サーバーモード。

Spring Bootは、サーバーモードなどのインラインデータベースを自動的に構成できます。 H2、HSQL、および Derbydatabases 。接続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-example

ステップ5: 依存関係を追加: Spring Web、Spring Data JPAおよび Apache Derbyデータベース

ステップ6: クリック Generate (生成)ボタンをクリックすると、プロジェクトがJarファイルにパッケージされ、ローカルシステムにダウンロードされます。

ステップ7: 展開 JarファイルをコピーしてSTSワークスペースに貼り付けます。

ステップ8: インポート

ファイル->インポート->既存のMavenプロジェクト->ブラウズ->フォルダーapacheを選択-derby-example->完了

インポートには少し時間がかかります。

ステップ9: フォルダー src/main/javaの名前で com.w3codebox.model のパッケージ内に

ステップ10: のパッケージ com.w3codebox.model の名前で UserRecord のクラス

の変数を定義し、次の操作を実行 id、name、およびemailGetterとSetterを生成
ファイルを右クリック-> Source-> Generate Getter and Setters
デフォルトのコンストラクタを定義アノテーションを使用 @EntityはクラスをEntity アノテーションを使用 @Idは Id 主要キーとしてマーク

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;
//デフォルトのコンストラクタ  
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: を開きます。 ApacheDerbyExampleApplication.java ファイルを開き、Javaアプリケーションとして実行します。

第19ステップ: ブラウザを開き、URL http:を呼び出します。//localhost:8080/。リストにユーザーが追加されていないため、空のリストが返されます。

データベースにユーザーを追加するには、以下を使用します。送信 POST Postmanのリクエスト

ステップ20: を開きます。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。それは、私たちがデータベースに挿入したユーザーを返します。