Spring Boot JPA项目示例图解

本文概述

  • 什么是JPA?
  • 为什么要使用JPA?
  • PSD功能
  • JPA架构
  • JPA类关系
  • JPA实施
  • 对象关系映射(ORM)
  • JPA版本
  • JPA和Hibernate之间的区别
  • Spring Boot Starter数据JPA
  • Spring Boot JPA示例
什么是JPA? Spring Boot JPA是用于管理Java应用程序中的关系数据的Java规范。它使我们能够在Java对象/类与关系数据库之间访问和持久化数据。 JPA遵循对象关系映射(ORM)。它是一组接口。它还提供了运行时EntityManager API, 用于处理针对数据库的对象上的查询和事务。它使用与平台无关的面向对象的查询语言JPQL(Java持久查询语言)。
在持久性方面, 它涵盖三个领域:
  • Java持久性API
  • 对象关系元数据
  • API本身, 在持久性包中定义
JPA不是框架。它定义了可以由任何框架实现的概念。
为什么要使用JPA? 与JDBC, SQL和手写映射相比, JPA更简单, 更简洁且劳动强度更低。 JPA适用于非性能导向的复杂应用程序。与JDBC相比, JPA的主要优点在于, 在JPA中, 数据由对象和类表示, 而在JDBC中, 数据由表和记录表示。它使用POJO表示持久化数据, 从而简化了数据库编程。 JPA还有其他优点:
  • JPA避免使用SQL的特定于数据库的方言编写DDL。取而代之的是, 它允许XML映射或使用Java注释。
  • JPA允许我们避免用SQL的数据库专用方言编写DML。
  • JPA允许我们完全不用任何DML语言来保存和加载Java对象和图形。
  • 当我们需要执行查询JPQL时, 它允许我们用Java实体而不是(本机)SQL表和列来表达查询。
PSD功能 JPA具有以下功能:
  • 它是一个功能强大的存储库和自定义对象映射抽象。
  • 它支持跨商店的持久性。这意味着一个实体可以部分存储在MySQL和Neo4j(图形数据库管理系统)中。
  • 它根据查询方法名称动态生成查询。
  • 域基类提供基本属性。
  • 它支持透明审核。
  • 集成自定义存储库代码的可能性。
  • 通过自定义名称空间很容易与Spring Framework集成。
JPA架构 JPA是将业务实体存储为关系实体的来源。它显示了如何将POJO定义为实体以及如何通过关系管理实体。
下图描述了JPA的类级别体系结构, 该体系结构描述了javax持久性软件包中定义的JPA的核心类和接口。 JPA体系结构包含以下单元:
  • 持久性:这是一个类, 包含用于获取EntityManagerFactory实例的静态方法。
  • EntityManagerFactory:这是EntityManager的工厂类。它创建和管理EntityManager的多个实例。
  • EntityManager:这是一个接口。它控制对对象的持久性操作。它适用于Query实例。
  • 实体:实体是将持久性对象存储为数据库中的记录。
  • 持久性单元:它定义了一组所有实体类。在应用程序中, EntityManager实例对其进行管理。实体类的集合表示单个数据存储中包含的数据。
  • EntityTransaction:它与EntityManager类具有一对一的关系。对于每个EntityManager, 操作由EntityTransaction类维护。
  • 查询:这是每个JPA供应商实现的接口, 用于获取符合条件的关系对象。
Spring Boot JPA项目示例图解

文章图片
JPA类关系 我们上面讨论的类和接口保持一种关系。下图显示了类和接口之间的关系。
Spring Boot 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和关系表的语言。
Spring Boot JPA项目示例图解

文章图片
ORM层存在于应用程序和数据库之间。它转换Java类和对象, 以便可以在关系数据库中存储和管理它们。默认情况下, 持久化的名称将成为表的名称, 而字段将成为列。建立应用程序后, 每个表行都对应一个对象。
JPA版本 【Spring Boot JPA项目示例图解】EJB的早期版本使用javax.ejb.EntityBean接口定义了与业务逻辑层结合的持久层。 EJB规范包括JPA的定义。
在引入EJB 3.0时, 持久层被分离并指定为JPA 1.0(Java Persistence API)。使用JSR 220, 此API的规范与JAVA EE5的规范一起于2006年5月11日发布。
JPA在2019年更名为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(休眠查询语言)的查询语言。
它在javax.persistence包中定义。 它在org.hibernate包中定义。
它在各种ORM工具(例如Hibernate, EclipseLink等)中实现。 Hibernate是JPA的提供者。
JPA使用EntityManager来处理数据的持久性。 在Hibernate中, 使用Session来处理数据的持久性。
Spring Boot Starter数据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和Derbydatabase。我们不需要提供任何连接URL。我们只需要在要使用的嵌入式数据库上包括构建依赖项即可。
在Spring Boot中, 我们只需在pom.xml文件中添加Derby依赖关系, 就可以轻松集成Apache Derby数据库。
< 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:提供群组名称。我们提供了com.srcmini。
步骤4:提供工件ID。我们提供了apache-derby-example。
步骤5:添加依赖项:Spring Web, Spring Data JPA和Apache Derby数据库。
步骤6:点击Generate(生成)按钮。当我们单击Generate按钮时, 它将项目封装在一个Jar文件中并将其下载到本地系统。
Spring Boot JPA项目示例图解

文章图片
步骤7:解压缩Jar文件并将其粘贴到STS工作区中。
步骤8:将项目文件夹导入STS。
文件-> 导入-> 现有Maven项目-> 浏览-> 选择文件夹apache-derby-example-> 完成
导入需要一些时间。
步骤9:在src / main / java文件夹中创建一个名称为com.srcmini.model的包。
步骤10:在com.srcmini.model包中创建一个名称为UserRecord的类, 并执行以下操作:
  • 定义三个变量id, 名称和电子邮件。
  • 生成Getter和Setter。
    右键单击文件-> 源-> 生成Getter和Setters
  • 定义一个默认的构造函数。
  • 使用注释@Entity将类标记为Entity。
  • 通过使用注释@Id将ID标记为主键。
UserRecord.java
package com.srcmini.model; import javax.persistence.Entity; import javax.persistence.Id; @Entitypublic class UserRecord { @Idprivate int id; private String name; private String email; //default conatructorpublic 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.srcmini.controller的包。
步骤12:在com.srcmini.controller包中创建一个名称为UserController的Controller类, 并执行以下操作:
  • 使用注释@RestController将类标记为控制器。
  • 通过使用注释@Autowired自动装配类UserService。
  • 我们定义了两种映射, 一种用于获取所有用户, 另一种用于添加用户。
UserController.java
package com.srcmini.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.srcmini.model.UserRecord; import com.srcmini.service.UserService; import java.util.List; @RestControllerpublic class UserController {@Autowiredprivate UserService userService; @RequestMapping("/")public List< UserRecord> getAllUser(){return userService.getAllUsers(); }@RequestMapping(value="http://www.srcmini.com/add-user", method=RequestMethod.POST)public void addUser(@RequestBody UserRecord userRecord){userService.addUser(userRecord); }}

步骤13:在src / main / java文件夹中创建一个名称为com.srcmini.service的软件包。
步骤14:在包com.srcmini.service中创建一个名称为UserController的Service类, 并执行以下操作:
  • 使用注释@Service将类标记为服务。
  • 自动连接UserRepository
  • 定义一个方法getAllUsers()返回一个列表
  • 定义另一个方法名称addUser()来保存用户记录。
UserService.java
package com.srcmini.service; import java.util.List; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.srcmini.model.UserRecord; import com.srcmini.repository.UserRepository; @Servicepublic class UserService {@Autowiredprivate 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.srcmini.repository的包。
步骤16:在包com.srcmini.repository中创建一个名称为UserRepository的存储库接口, 并扩展CrudRepository。
UserRepository.java
package com.srcmini.repository; import org.springframework.data.repository.CrudRepository; import com.srcmini.model.UserRecord; public interface UserRepository extends CrudRepository< UserRecord, String> {}

步骤17:现在, 打开ApacheDerbyExampleApplication.java文件。它是在我们设置应用程序时默认创建的。
ApacheDerbyExampleApplication.java
package com.srcmini; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicationpublic class ApacheDerbyExampleApplication {public static void main(String[] args) {SpringApplication.run(ApacheDerbyExampleApplication.class, args); }}

现在, 我们已根据要求设置了所有必需的类和包。注意, 我们没有为数据库提供任何连接URL。完成上述所有步骤后, 项目目录如下所示:
Spring Boot JPA项目示例图解

文章图片
让我们运行该应用程序。
步骤18:打开ApacheDerbyExampleApplication.java文件, 并将其作为Java应用程序运行。
步骤19:打开浏览器并调用URL http:// localhost:8080 /。它返回一个空列表, 因为我们没有在列表中添加任何用户。
要将用户添加到数据库, 我们将使用邮递员发送POST请求。
步骤20:打开邮递员, 然后执行以下操作:
  • 选择POST
  • 调用URL http:// localhost:8080 / add-user。
  • 点击身体
  • 选择Content-Type作为JSON(application / json)。
  • 将要插入的数据插入数据库中。我们插入了以下数据:
{"id": "001", "name": "Tom", "email": "tom@gmail.com"}

  • 单击发送按钮。
Spring Boot JPA项目示例图解

文章图片
当我们单击发送按钮时, 它显示Status:200 OK。这意味着请求已成功执行。
步骤21:打开浏览器并调用URL http:// localhost:8080。它返回我们已经插入数据库中的用户。
Spring Boot JPA项目示例图解

文章图片
下载Apache derby示例项目

    推荐阅读