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供应商实现,以获取符合条件的关系对象。
JPA类关系
我们上面讨论的类和接口保持一种关系。下图显示了类和接口之间的关系。
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和关系表的语言。
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文件中,并将其下载到本地系统。
步骤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 。完成上述所有步骤后,项目目录如下所示:
让我们运行该应用程序。
步骤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"
}
点击发送按钮。
当我们单击"发送"按钮时,它显示状态: 200 OK 。这表示请求已成功执行。
步骤21: 打开浏览器并调用URL http: //localhost: 8080。它返回我们已插入数据库中的用户。