Spring Boot - JPA

Spring Boot - JPA 首页 / Spring Boot入门教程 / Spring Boot - JPA

什么是JPA?

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

在持久性方面,它涵盖三个领域:

  • Java持久性API
  • 对象关系元数据
  • persistence 包中定义的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表和列来表达查询。

JPA架构

JPA是将业务实体存储为关系实体的来源。它显示了如何将POJO定义为实体以及如何通过关系管理实体。

下图描述了JPA的类级别的体系结构,该体系结构描述了在 javax persistence 包中定义的JPA的核心类和接口。 JPA体系结构包含以下单元:

  • Persistence                           -  这是一个包含用于获取EntityManagerFactory实例的静态方法的类。
  • EntityManagerFactory     -  这是EntityManager的工厂类。它创建和管理EntityManager的多个实例。
  • EntityManager                    -  它是一个界面。它控制对对象的持久性操作。它适用于Query实例。
  • Entity                                      -  实体是作为记录存储在数据库中的持久性对象。
  • Persistence Unit                 - 它定义了一组所有实体类。在程序中,EntityManager实例对其进行管理。
  • EntityTransaction              - 它与EntityManager类具有一对一关系。对于每个EntityManager,操作都由EntityTransaction类维护。
  • Query                                      -  它是每个JPA供应商实现的接口,用于获取符合条件的关系对象。
Spring Boot jpa

JPA类关系

无涯教程上面讨论的类和接口保持一种关系。下图显示了类和接口之间的关系。

Spring Boot jpa
  • EntityManager和EntiyTransaction之间的关系是一对一。每个EntityManager操作都有一个EntityTransaction实例。
  • EntityManageFactory和EntiyManager之间的关系是一对多。这是EntityManager实例的工厂类。
  • EntityManager和查询之间的关系是一对多。通过使用EntityManager类的实例可以执行任意数量的查询。
  • EntityManager和Entity之间的关系是一对多。 EntityManager实例可以管理多个实体。

JPA实现

JPA是一个开源API。有各种各样的企业供应商,例如Eclipse,RedHat,Oracle等,通过在其中添加JPA来提供新产品。有一些流行的JPA实现框架,例如 Hibernate,EclipseLink,DataNucleus 等。它也称为 Object-Relation Mapping (ORM)工具。

关系映射(ORM)

在ORM中,Java对象到数据库表的映射,反之亦然,称为 Object-Relational Mapping。ORM映射充当关系数据库(表)之间的桥梁。

在下图中,ORM层是适配器层。它使对象图的语言适应SQL和关系表的语言。

Spring Boot jpa

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

JPA版本

EJB的早期版本使用 javax.ejb.EntityBean 接口定义了与业务逻辑层结合的持久层。 EJB规范包括JPA的定义。

在引入EJB 3.0时,持久层被分离并指定为JPA 1.0(Java Persistence API)。使用JSR 220,此API的规范与JAVA EE5的规范一起于2006年5月11日发布。

在2019年,JPA重命名为 Jakarta Persistence 。 JPA的最新版本是 2.2 。它支持以下函数:

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

JPA Vs Hibernate

JPA              -  JPA是一种Java规范,用于访问,管理和持久化Java对象与关系数据库之间的数据。这是ORM的标准方法。

Hibernate  -  这是一个轻量级的开源ORM工具,用于在关系数据库系统中存储Java对象。它是JPA的提供者。它遵循JPA提供的通用方法。

下表描述了JPA和Hibernate之间的区别。

JPAHibernate
JPA是 Java规范,用于在Java应用程序中映射关系数据。 Hibernate是一个用于处理数据持久性的 ORM框架
JPA不提供任何实现类。它提供了实现类。
它使用称为 JPQL (Java持久性查询语言)的平台无关的查询语言。它使用自己的称为 HQL 的查询语言(Hibernate查询语言)。
它在 javax.persistence 包中定义。它在 org.hibernate 包中定义。
它在各种ORM工具(如 Hibernate,EclipseLink等等)中实现。Hibernate是JPA的提供者
JPA使用 EntityManager 处理d的持久性在Hibernate中,使用 Session 处理数据的持久性。

Starter Data 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>

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.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  -  填写Group名称。

步骤4  -  填写Artifact ID。

步骤5  -  添加依赖项: Spring Web,Spring Data JPA Apache Derby数据库

步骤6  -  单击 Generate (生成)按钮。当无涯教程单击Generate按钮时,它将项目封装在一个Jar文件中,并将其下载到本地系统。

Spring Boot jpa

步骤7    -  提取(Extract),然后将其粘贴到STS工作区中。

步骤8    -  目文件夹导入STS。

File -> Import -> Existing Maven Projects -> Browse -> Select the folder apache-derby-example -> Finish

步骤9    -  在文件夹 src/main/java中创建一个名称为 com.learnfk.model 的软件包。

步骤10  -  在包 com.learnfk.model 中创建一个名称为 UserRecord 的类,然后执行以下操作:

  • 定义三个变量 id, name, and email.
  • 生成Getter和Setter。右键点击 file -> Source -> Generate Getters and Setters
  • 定义一个默认的构造函数。
  • 使用注释@Entity将类标记为Entity。
  • 通过使用注释@Id将ID标记为主键。

UserRecord.java

package com.learnfk.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.learnfk.controller 的软件包。

步骤12  -  在包 com.learnfk.controller 中创建一个名称为 UserController 的Controller类,并执行以下操作:

  • 通过使用注释 @RestController ,将该类标记为控制器。
  • 使用注释 @Autowired 自动连接类 UserService
  • 无涯教程定义了两个映射,一个映射用于获取所有用户(getAllUser),另一个映射用于添加用户(addUser)

UserController.java

package com.learnfk.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.learnfk.model.UserRecord;
import com.learnfk.service.UserService;
import java.util.List;  
@RestController  
public class UserController 
{  
  @Autowired  
  private UserService userService;   
  @RequestMapping("/")  
  public List 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.learnfk.service 的软件包。

步骤14  -  在包 com.learnfk.service 中创建一个名称为 UserController 的Service类,并执行以下操作:

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

UserService.java

package com.learnfk.service;  
import java.util.List;  
import java.util.ArrayList;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;
import com.learnfk.model.UserRecord;
import com.learnfk.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.learnfk.repository 的软件包。

步骤16  -  在包 com.learnfk.repository 中创建名称为 UserRepository 的存储库接口,并扩展 CrudRepository

UserRepository.java

package com.learnfk.repository;  
import org.springframework.data.repository.CrudRepository;
import com.learnfk.model.UserRecord;  
public interface UserRepository extends CrudRepository 
{  
}  

步骤17  -  现在,打开 ApacheDerbyExampleApplication.java 文件。它是在无涯教程设置应用程序时默认创建的。

ApacheDerbyExampleApplication.java

package com.learnfk;
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

让无涯教程运行该应用程序。

步骤18  -  打开ApacheDerbyExampleApplication.java文件,并将其作为Java应用程序运行。

步骤19  -  打开浏览器并调用URL http://localhost:8080/。它返回一个空列表,因为没有在列表中添加任何用户。

要将用户添加到数据库中,将使用 Postman 发送 POST 请求。

步骤20  -  打开Postman,然后执行以下操作:

  • 选择 POST
  • 调用URL http://localhost:8080/add-user。
  • 点击Bodu
  • 选择Content-Type作为 JSON (application/json)。
  • 将要插入的数据插入数据库中。无涯教程插入了以下数据:
{
"id": "001",
"name": "Tom",
"email": "tom@gmail.com"
}
  • 点击发送按钮。
Spring Boot jpa

当无涯教程单击"Send"按钮时,它显示状态:200 OK 。这意味着请求已成功执行。

步骤21  -  打开浏览器并调用URL http:// localhost:8080。它返回已经插入数据库中的用户。

Spring Boot jpa

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

零基础学Python -〔尹会生〕

大规模数据处理实战 -〔蔡元楠〕

Web协议详解与抓包实战 -〔陶辉〕

TypeScript开发实战 -〔梁宵〕

分布式技术原理与算法解析 -〔聂鹏程〕

NLP实战高手课 -〔王然〕

Redis源码剖析与实战 -〔蒋德钧〕

中间件核心技术与实战 -〔丁威〕

结构执行力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)