本文概述
- 什么是JPA?
- 为什么要使用JPA?
- PSD功能
- JPA架构
- JPA类关系
- JPA实施
- 对象关系映射(ORM)
- JPA版本
- JPA和Hibernate之间的区别
- Spring Boot Starter数据JPA
- Spring Boot JPA示例
在持久性方面, 它涵盖三个领域:
- Java持久性API
- 对象关系元数据
- API本身, 在持久性包中定义
为什么要使用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表和列来表达查询。
- 它是一个功能强大的存储库和自定义对象映射抽象。
- 它支持跨商店的持久性。这意味着一个实体可以部分存储在MySQL和Neo4j(图形数据库管理系统)中。
- 它根据查询方法名称动态生成查询。
- 域基类提供基本属性。
- 它支持透明审核。
- 集成自定义存储库代码的可能性。
- 通过自定义名称空间很容易与Spring Framework集成。
下图描述了JPA的类级别体系结构, 该体系结构描述了javax持久性软件包中定义的JPA的核心类和接口。 JPA体系结构包含以下单元:
- 持久性:这是一个类, 包含用于获取EntityManagerFactory实例的静态方法。
- EntityManagerFactory:这是EntityManager的工厂类。它创建和管理EntityManager的多个实例。
- EntityManager:这是一个接口。它控制对对象的持久性操作。它适用于Query实例。
- 实体:实体是将持久性对象存储为数据库中的记录。
- 持久性单元:它定义了一组所有实体类。在应用程序中, EntityManager实例对其进行管理。实体类的集合表示单个数据存储中包含的数据。
- EntityTransaction:它与EntityManager类具有一对一的关系。对于每个EntityManager, 操作由EntityTransaction类维护。
- 查询:这是每个JPA供应商实现的接口, 用于获取符合条件的关系对象。
文章图片
JPA类关系 我们上面讨论的类和接口保持一种关系。下图显示了类和接口之间的关系。
文章图片
- EntityManager和EntiyTransaction之间的关系是一对一的。每个EntityManager操作都有一个EntityTransaction实例。
- EntityManageFactory和EntiyManager之间的关系是一对多的。它是EntityManager实例的工厂类。
- EntityManager和Query之间的关系是一对多的。我们可以使用EntityManager类的实例来执行任意数量的查询。
- EntityManager和Entity之间的关系是一对多的。 EntityManager实例可以管理多个实体。
对象关系映射(ORM) 在ORM中, Java对象到数据库表的映射(反之亦然)称为对象关系映射。 ORM映射充当关系数据库(表和记录)和Java应用程序(类和对象)之间的桥梁。
在下图中, ORM层是适配器层。它使对象图的语言适应SQL和关系表的语言。
文章图片
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
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来处理数据的持久性。 |
<
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中, 我们只需在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文件中并将其下载到本地系统。
文章图片
步骤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标记为主键。
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。
- 我们定义了两种映射, 一种用于获取所有用户, 另一种用于添加用户。
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()来保存用户记录。
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。完成上述所有步骤后, 项目目录如下所示:
文章图片
让我们运行该应用程序。
步骤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"}
- 单击发送按钮。
文章图片
当我们单击发送按钮时, 它显示Status:200 OK。这意味着请求已成功执行。
步骤21:打开浏览器并调用URL http:// localhost:8080。它返回我们已经插入数据库中的用户。
文章图片
下载Apache derby示例项目
推荐阅读
- Spring Boot属性(application.properties详细介绍)
- Spring Boot打包文件格式(JAR、WAR、EAR)
- Spring Boot JDBC项目示例图解
- Spring Boot自动配置项目示例图文详解
- Spring Boot Hello World示例(图文)
- Spring Boot下载并安装STS IDE详细步骤图解
- Spring Boot CLI创建并运行Web项目
- Spring Boot依赖管理详细介绍
- Spring Boot DevTools用法示例图解