Spring Boot JPA



Spring Boot JPA

什么是JPA?

Spring Boot JPA 是用于管理的Java规范Java应用程序中的
关系数据。它允许我们访问和持久化Java对象/类与关系数据库之间的数据。 JPA遵循
对象关系映射(ORM)。它是一组接口。它还提供了运行时
EntityManager API,用于处理针对数据库对象的查询和事务。它使用与平台无关的面向对象的查询语言JPQL(Java持久查询语言)。
在持久性方面,它涵盖了三个领域:

Java持久性API
Object-Relational元数据
persistence 包中定义的API本身

JPA不是框架。它定义了可以在任何框架中实现的概念。

为什么我们应该使用JPA?

与JDBC相比,JPA更简单,更清洁且劳动强度更低,SQL和手写映射。 JPA适用于非性能导向的复杂应用程序。与JDBC相比,JPA的主要优点在于,在JPA中,数据由对象和类表示,而在JDBC中,数据由表和记录表示。它使用POJO表示持久数据,从而简化了数据库编程。 JPA还有其他优点:

JPA避免使用SQL的特定于数据库的方言编写DDL。取而代之的是,它允许以XML或使用Java注解进行映射。
JPA允许我们避免用SQL的数据库专用方言编写DML。
JPA允许我们完全不使用任何DML语言来保存和加载Java对象和图形。
当我们需要执行查询JPQL时,它允许我们用Java实体而不是(本机)SQL表和列来表达查询。

JPA功能

JPA具有以下功能:

这是一个功能强大的存储库和自定义的对象映射抽象。
它支持跨商店持久性。这意味着一个实体可以部分存储在MySQL和Neo4j(图形数据库管理系统)中。
它从查询方法名称动态生成查询。
域基类提供基本属性。
它支持透明审核。
集成自定义存储库代码的可能性。
通过自定义名称空间很容易与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供应商实现,以获取符合条件的关系对象。
Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第1张

JPA类关系

我们上面讨论的类和接口保持一种关系。下图显示了类和接口之间的关系。

Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第2张
EntityManager和EntiyTransaction之间的关系是一对一。每个EntityManager操作都有一个EntityTransaction实例。
EntityManageFactory和EntiyManager之间的关系是一对多。这是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和关系表的语言。

Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第3张

ORM层存在于应用程序和数据库之间。它转换Java类和对象,以便可以在关系数据库中存储和管理它们。默认情况下,持久化的名称将成为表的名称,而字段将成为列。一旦应用程序建立,每个表行都对应一个对象。

JPA版本

EJB的早期版本定义了与业务逻辑层结合的持久层。使用
javax.ejb.EntityBean 接口。 EJB规范包括JPA的定义。
在引入EJB 3.0时,持久层被分离并指定为JPA 1.0(Java Persistence API)。该API的规范已与2006年5月11日使用JSR 220的JAVA EE5规范一起发布。
2019年,JPA重命名为
Jakarta Persistence 。 JPA的最新版本是
2.2 。它支持以下功能:

Java 8,数据和时间API
AttributeConvertes中的CDI注入
它使注解@Repeatable

JPA和Hibernate之间的区别

JPA: JPA是一种Java规范,用于访问,管理和持久化之间的数据Java对象和关系数据库。这是ORM的标准方法。
Hibernate: 这是一种轻量级的开源ORM工具,用于在关系数据库系统中存储Java对象。它是JPA的提供者。它遵循JPA提供的一种通用方法。
下表描述了JPA和Hibernate之间的区别。
JPA Hibernate
JPA是用于在Java应用程序中映射关系数据的 Java规范 Hibernate是一个用于处理数据持久性的 ORM框架
JPA不提供任何实现类。 它提供了实现类。
它使用称为 JPQL (Java持久性查询语言)的平台无关的查询语言。 它使用自己的称为 HQL 的查询语言(Hibernate查询语言)。
它在 javax.persistence 包中定义。 它在 org.hibernate 包中定义。
它在 Hibernate,EclipseLink 等各种ORM工具中实现。 Hibernate是JPA的提供者
JPA使用 EntityManager 处理数据的持久性。 在Hibernate中,使用 Session 处理数据的持久性。

Spring Boot启动程序数据JPA

Spring Boot提供了启动程序依赖项
spring-boot-starter-data-jpa 以连接Spring Boot应用程序高效地使用关系数据库。 spring-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>

Spring Boot JPA示例

我们创建一个使用JPA连接到数据库的Spring Boot应用程序。在下面的示例中,我们使用了内存数据库
Apache Derby。
Apache Derby : 这是一个嵌入式的
开源软件关系数据库完全用Java实现。它在Apache License 2.0下可用。 Apache Derby具有以下优点:

易于安装,部署和使用。
它基于Java,JDBC和SQL标准。
它提供了一个嵌入式JDBC驱动程序,可让我们将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.lidihuo。
步骤4: 提供
Artifact ID。我们提供了
apache-derby-example
步骤5: 添加依赖项:
Spring Web,Spring Data JPA
Apache Derby数据库
步骤6: 单击
Generate (生成)按钮。当我们单击"生成"按钮时,它会将项目包装到一个Jar文件中,并将其下载到本地系统。

Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第4张

步骤7: 提取 Jar文件并将其粘贴到STS工作区中。
步骤8: 导入
文件->导入->现有Maven项目->浏览->选择文件夹apache-derby-example->完成
导入需要一些时间。
步骤9: 在文件夹
src/main/java中创建一个名称为
com.lidihuo.model 的包。
步骤10: 在包
com.lidihuo.model 中创建一个名称为
UserRecord 的类,然后执行以下:

定义三个变量 id, name, and email
生成Getter和Setter。
右键单击文件-> Source-> Generate Getter和Setters

定义默认的构造函数。
使用注解 @Entity将类标记为Entity
使用注解 @Id将 Id 标记为主键。

UserRecord.java
package com.lidihuo.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文件夹中创建一个名称为 com.lidihuo.controller 的包。
步骤12: 在包
com.lidihuo.controller 中创建一个名称为
UserController 的Controller类,并执行以下操作:

使用注解 @RestController 将类标记为控制器。
使用注解 @Autowired 自动连接类 UserService
我们定义了两个映射,一个映射用于获取所有用户,另一个映射用于添加用户。

UserController.java
package com.lidihuo.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.lidihuo.model.UserRecord;
import com.lidihuo.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.lidihuo.service 的包。
步骤14: 在包
com.lidihuo.service 中创建名称为
UserController 的Service类,并执行以下操作:

通过使用注解 @Service将该类标记为服务。
自动连接 UserRepository
定义方法 getAllUsers(),该方法返回以下列表:
定义另一个方法名称 addUser(),以保存用户记录。

UserService.java
package com.lidihuo.service;  
import java.util.List;  
import java.util.ArrayList;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;
import com.lidihuo.model.UserRecord;
import com.lidihuo.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.lidihuo.repository 的包。
步骤16: 在包
com.lidihuo.repository 中创建名称为
UserRepository 的存储库接口,并扩展
CrudRepository
UserRepository.java
package com.lidihuo.repository;  
import org.springframework.data.repository.CrudRepository;
import com.lidihuo.model.UserRecord;  
public interface UserRepository extends CrudRepository<UserRecord, String> 
{  
}  

步骤17: 现在,打开
ApacheDerbyExampleApplication.java 文件。它是在我们设置应用程序时默认创建的。
ApacheDerbyExampleApplication.java
package com.lidihuo;
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 。完成上述所有步骤后,项目目录如下所示:

Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第5张

让我们运行该应用程序。
步骤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": "001",
"name": "Tom",
"email": "tom@gmail.com"
}

点击发送按钮。
Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第6张

当我们单击"发送"按钮时,它显示
状态: 200 OK 。这表示请求已成功执行。
步骤21: 打开浏览器并调用URL http: //localhost: 8080。它返回我们已插入数据库中的用户。

Spring Boot JPA_https://bianchenghao6.com_【SpringBoot 教程】_第7张