Spring Boot JPA

什么是JPA?

Spring Boot JPA 是用于管理的Java規(guī)范Java應(yīng)用程序中的關(guān)系數(shù)據(jù)。它允許我們訪問和持久化Java對象/類與關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)。 JPA遵循對象關(guān)系映射(ORM)。它是一組接口。它還提供了運行時 EntityManager API,用于處理針對數(shù)據(jù)庫對象的查詢和事務(wù)。它使用與平臺無關(guān)的面向?qū)ο蟮牟樵冋Z言JPQL(Java持久查詢語言)。

在持久性方面,它涵蓋了三個領(lǐng)域:

Java持久性API Object-Relational元數(shù)據(jù) persistence 包中定義的API本身

JPA不是框架。它定義了可以在任何框架中實現(xiàn)的概念。

為什么我們應(yīng)該使用JPA?

與JDBC相比,JPA更簡單,更清潔且勞動強度更低,SQL和手寫映射。 JPA適用于非性能導(dǎo)向的復(fù)雜應(yīng)用程序。與JDBC相比,JPA的主要優(yōu)點在于,在JPA中,數(shù)據(jù)由對象和類表示,而在JDBC中,數(shù)據(jù)由表和記錄表示。它使用POJO表示持久數(shù)據(jù),從而簡化了數(shù)據(jù)庫編程。 JPA還有其他優(yōu)點:

JPA避免使用SQL的特定于數(shù)據(jù)庫的方言編寫DDL。取而代之的是,它允許以XML或使用Java注解進(jìn)行映射。 JPA允許我們避免用SQL的數(shù)據(jù)庫專用方言編寫DML。 JPA允許我們完全不使用任何DML語言來保存和加載Java對象和圖形。當(dāng)我們需要執(zhí)行查詢JPQL時,它允許我們用Java實體而不是(本機)SQL表和列來表達(dá)查詢。

JPA功能

JPA具有以下功能:

這是一個功能強大的存儲庫和自定義的對象映射抽象。 它支持跨商店持久性。這意味著一個實體可以部分存儲在MySQL和Neo4j(圖形數(shù)據(jù)庫管理系統(tǒng))中。它從查詢方法名稱動態(tài)生成查詢。域基類提供基本屬性。它支持透明審核。集成自定義存儲庫代碼的可能性。通過自定義名稱空間很容易與Spring Framework集成。

JPA體系結(jié)構(gòu)

JPA是將業(yè)務(wù)實體存儲為關(guān)系實體的源。它顯示了如何將POJO定義為實體以及如何通過關(guān)系管理實體。

下圖描述了JPA的類級別體系結(jié)構(gòu),該體系結(jié)構(gòu)描述了JPA的核心類和接口。 javax持久性包。 JPA體系結(jié)構(gòu)包含以下單元:

Persistence: 這是一個包含用于獲取EntityManagerFactory實例的靜態(tài)方法的類。 EntityManagerFactory: 是EntityManager的工廠類。它創(chuàng)建和管理EntityManager的多個實例。 EntityManager: 。它是一個界面。它控制對對象的持久性操作。它適用于Query實例。 Entity: 實體是作為記錄存儲在數(shù)據(jù)庫中的持久性對象。 Persistence Unit: 它定義了一組所有實體類。在應(yīng)用程序中,EntityManager實例對其進(jìn)行管理。一組實體類表示包含在單個數(shù)據(jù)存儲中的數(shù)據(jù)。 EntityTransaction: 它與EntityManager類具有一對一關(guān)系。對于每個EntityManager,操作都由EntityTransaction類維護(hù)。 Query: 該接口由每個JPA供應(yīng)商實現(xiàn),以獲取符合條件的關(guān)系對象。Spring Boot jpa

JPA類關(guān)系

我們上面討論的類和接口保持一種關(guān)系。下圖顯示了類和接口之間的關(guān)系。

Spring Boot jpa EntityManager和EntiyTransaction之間的關(guān)系是一對一。每個EntityManager操作都有一個EntityTransaction實例。 EntityManageFactory和EntiyManager之間的關(guān)系是一對多。這是EntityManager實例的工廠類。 EntityManager和Query之間的關(guān)系是一對多。我們可以使用EntityManager類的實例執(zhí)行任意數(shù)量的查詢。 EntityManager和Entity之間的關(guān)系是一對多。 EntityManager實例可以管理多個實體。

JPA實現(xiàn)

JPA是一種開源API。有各種企業(yè)供應(yīng)商,例如Eclipse,RedHat,Oracle等,通過在其中添加JPA來提供新產(chǎn)品。有一些流行的JPA實現(xiàn)框架,例如 Hibernate,EclipseLink,DataNucleus 等。它也稱為對象關(guān)系映射(ORM)工具。

對象關(guān)系映射(ORM)

在ORM中,Java對象到數(shù)據(jù)庫表的映射(反之亦然)被稱為對象關(guān)系映射。 ORM映射充當(dāng)關(guān)系數(shù)據(jù)庫(表和記錄)和 Java應(yīng)用程序(類和對象)之間的橋梁。

在下面如圖所示,ORM層是適配器層。它將對象圖的語言適應(yīng)SQL和關(guān)系表的語言。

Spring Boot jpa

ORM層存在于應(yīng)用程序和數(shù)據(jù)庫之間。它轉(zhuǎn)換Java類和對象,以便可以在關(guān)系數(shù)據(jù)庫中存儲和管理它們。默認(rèn)情況下,持久化的名稱將成為表的名稱,而字段將成為列。一旦應(yīng)用程序建立,每個表行都對應(yīng)一個對象。

JPA版本

EJB的早期版本定義了與業(yè)務(wù)邏輯層結(jié)合的持久層。使用 javax.ejb.EntityBean 接口。 EJB規(guī)范包括JPA的定義。

在引入EJB 3.0時,持久層被分離并指定為JPA 1.0(Java Persistence API)。該API的規(guī)范已與2006年5月11日使用JSR 220的JAVA EE5規(guī)范一起發(fā)布。

2019年,JPA重命名為 Jakarta Persistence 。 JPA的最新版本是 2.2 。它支持以下功能:

Java 8,數(shù)據(jù)和時間API AttributeConvertes中的CDI注入它使注解@Repeatable

JPA和Hibernate之間的區(qū)別

JPA: JPA是一種Java規(guī)范,用于訪問,管理和持久化之間的數(shù)據(jù)Java對象和關(guān)系數(shù)據(jù)庫。這是ORM的標(biāo)準(zhǔn)方法。

Hibernate: 這是一種輕量級的開源ORM工具,用于在關(guān)系數(shù)據(jù)庫系統(tǒng)中存儲Java對象。它是JPA的提供者。它遵循JPA提供的一種通用方法。

下表描述了JPA和Hibernate之間的區(qū)別。

JPA Hibernate
JPA是用于在Java應(yīng)用程序中映射關(guān)系數(shù)據(jù)的 Java規(guī)范Hibernate是一個用于處理數(shù)據(jù)持久性的 ORM框架。
JPA不提供任何實現(xiàn)類。它提供了實現(xiàn)類。
它使用稱為 JPQL (Java持久性查詢語言)的平臺無關(guān)的查詢語言。它使用自己的稱為 HQL 的查詢語言(Hibernate查詢語言)。
它在 javax.persistence 包中定義。它在 org.hibernate 包中定義。
它在 Hibernate,EclipseLink 等各種ORM工具中實現(xiàn)。Hibernate是JPA的提供者。
JPA使用 EntityManager 處理數(shù)據(jù)的持久性。在Hibernate中,使用 Session 處理數(shù)據(jù)的持久性。

Spring Boot啟動程序數(shù)據(jù)JPA

Spring Boot提供了啟動程序依賴項 spring-boot-starter-data-jpa 以連接Spring Boot應(yīng)用程序高效地使用關(guān)系數(shù)據(jù)庫。 spring-boot-starter-data-jpa在內(nèi)部使用spring-boot-jpa依賴項。

<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-starter-data-jpa</artifactId>  
<version>2.2.2.RELEASE</version>  
</dependency>

Spring Boot JPA示例

我們創(chuàng)建一個使用JPA連接到數(shù)據(jù)庫的Spring Boot應(yīng)用程序。在下面的示例中,我們使用了內(nèi)存數(shù)據(jù)庫 Apache Derby。

Apache Derby : 這是一個嵌入式的開源軟件關(guān)系數(shù)據(jù)庫完全用Java實現(xiàn)。它在Apache License 2.0下可用。 Apache Derby具有以下優(yōu)點:

易于安裝,部署和使用。它基于Java,JDBC和SQL標(biāo)準(zhǔn)。它提供了一個嵌入式JDBC驅(qū)動程序,可讓我們將Derby嵌入任何基于Java的解決方案中。它還通過Derby Network Client JDBC驅(qū)動程序和Derby Network Server支持客戶機/服務(wù)器模式。

Spring Boot可以自動配置嵌入式數(shù)據(jù)庫,例如 H2,HSQL, Derbydatabases 。我們不需要提供任何連接URL。我們只需要包含要使用的嵌入式數(shù)據(jù)庫的構(gòu)建依賴項即可。

在Spring Boot中,只需在pom中添加 Derby 依賴項即可輕松集成Apache Derby數(shù)據(jù)庫。 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名稱。我們已經(jīng)提供了 com.nhooo。

步驟4: 提供Artifact ID。我們提供了 apache-derby-example

步驟5: 添加依賴項: Spring Web,Spring Data JPA Apache Derby數(shù)據(jù)庫

步驟6: 單擊 Generate (生成)按鈕。當(dāng)我們單擊"生成"按鈕時,它會將項目包裝到一個Jar文件中,并將其下載到本地系統(tǒng)。

 Spring Boot jpa

步驟7: 提取 Jar文件并將其粘貼到STS工作區(qū)中。

步驟8: 導(dǎo)入

文件->導(dǎo)入->現(xiàn)有Maven項目->瀏覽->選擇文件夾apache-derby-example->完成

導(dǎo)入需要一些時間。

步驟9: 在文件夾 src/main/java中創(chuàng)建一個名稱為 com.nhooo.model 的包。

步驟10: 在包 com.nhooo.model 中創(chuàng)建一個名稱為 UserRecord 的類,然后執(zhí)行以下:

定義三個變量 id, name, and email。生成Getter和Setter。
右鍵單擊文件-> Source-> Generate Getter和Setters
定義默認(rèn)的構(gòu)造函數(shù)。使用注解 @Entity將類標(biāo)記為Entity。 使用注解 @Id將 Id 標(biāo)記為主鍵。

UserRecord.java

package com.nhooo.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity  
public class UserRecord 
{ 
@Id  
private int id;  
private String name;  
private String email;
//default conatructor  
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文件夾中創(chuàng)建一個名稱為 com.nhooo.controller 的包。

步驟12: 在包 com.nhooo.controller 中創(chuàng)建一個名稱為 UserController 的Controller類,并執(zhí)行以下操作:

使用注解 @RestController 將類標(biāo)記為控制器。使用注解 @Autowired 自動連接類 UserService 我們定義了兩個映射,一個映射用于獲取所有用戶,另一個映射用于添加用戶。

UserController.java

package com.nhooo.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.nhooo.model.UserRecord;
import com.nhooo.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中創(chuàng)建一個名稱為 com.nhooo.service 的包。

步驟14: 在包 com.nhooo.service 中創(chuàng)建名稱為 UserController 的Service類,并執(zhí)行以下操作:

通過使用注解 @Service將該類標(biāo)記為服務(wù)。 自動連接 UserRepository 定義方法 getAllUsers(),該方法返回以下列表: 定義另一個方法名稱 addUser(),以保存用戶記錄。

UserService.java

package com.nhooo.service;  
import java.util.List;  
import java.util.ArrayList;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;
import com.nhooo.model.UserRecord;
import com.nhooo.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中創(chuàng)建一個名稱為 com.nhooo.repository 的包。

步驟16: 在包 com.nhooo.repository 中創(chuàng)建名稱為 UserRepository 的存儲庫接口,并擴(kuò)展 CrudRepository 。

UserRepository.java

package com.nhooo.repository;  
import org.springframework.data.repository.CrudRepository;
import com.nhooo.model.UserRecord;  
public interface UserRepository extends CrudRepository<UserRecord, String> 
{  
}

步驟17: 現(xiàn)在,打開 ApacheDerbyExampleApplication.java 文件。它是在我們設(shè)置應(yīng)用程序時默認(rèn)創(chuàng)建的。

ApacheDerbyExampleApplication.java

package com.nhooo;
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);
}
}

現(xiàn)在,我們已根據(jù)要求設(shè)置了所有必需的類和程序包。請注意,我們沒有為數(shù)據(jù)庫提供任何連接URL 。完成上述所有步驟后,項目目錄如下所示:

Spring Boot jpa

讓我們運行該應(yīng)用程序。

步驟18: 打開 ApacheDerbyExampleApplication.java 文件并將其作為Java應(yīng)用程序運行。

第19步: 打開瀏覽器并調(diào)用URL http://localhost:8080/。由于未在列表中添加任何用戶,因此返回空列表。

要將用戶添加到數(shù)據(jù)庫,我們將使用發(fā)送 POST 請求Postman。

步驟20: 打開Postman,然后執(zhí)行以下操作:

選擇 POST 調(diào)用URL http://localhost:8080/add-user。點擊Body 選擇Content-Type作為JSON (application/json)。將要插入的數(shù)據(jù)插入數(shù)據(jù)庫中。我們插入了以下數(shù)據(jù):

{
"id": "001",
"name": "Tom",
"email": "tom@gmail.com"
}

點擊發(fā)送按鈕。Spring Boot jpa

當(dāng)我們單擊"發(fā)送"按鈕時,它顯示狀態(tài): 200 OK 。這表示請求已成功執(zhí)行。

步驟21: 打開瀏覽器并調(diào)用URL http: //localhost: 8080。它返回我們已插入數(shù)據(jù)庫中的用戶。

Spring Boot jpa


丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清