Spring Data是一个高级Spring Source项目。其目的是统一并轻松访问关系数据库系统和NoSQL数据存储等不同类型的持久性存储。
在实现新应用程序时,我们应该专注于业务逻辑而不是技术复杂性和样板代码。这就是Java持久性API(JPA)规范和Spring Data JPA非常受欢迎的原因。
Spring Data JPA在JPA的顶部增加了一层。这意味着,Spring Data JPA使用JPA规范定义的所有功能,尤其是实体,关联映射和JPA的查询功能。 Spring Data JPA添加了自己的功能,例如存储库模式的无代码实现以及从方法名称创建数据库查询。
Spring Data JPA处理大多数基于JDBC的数据库访问和ORM(对象关系映射)的复杂性。它减少了JPA所需的样板代码。
Spring Data JPA旨在通过减少所需的工作量来改进数据访问层的实现。
Spring Data JPA有 三个主要功能,如下所示:
无代码存储库: 这是最流行的与持久性相关的模式。它使我们能够在更高的抽象级别上实现业务代码。 简化的样板代码: 它通过其存储库接口为每种方法提供默认实现。这意味着不再需要实现读写操作。 生成的查询: Spring Data JPA的另一个功能是根据方法名称生成数据库查询。如果查询不太复杂,则需要在存储库接口上定义一个以 findBy 开头的名称的方法。定义方法后,Spring解析方法名称并为其创建查询。例如:
public interface EmployeeRepository extends CrudRepository<Employee, Long> { Employee findByName(String name); }
在上面的示例中,我们扩展了使用两个泛型的 CrudRepository : Employee 和 Long 。 Employee是要管理的 实体,而 Long 是主键的数据类型
Spring内部会生成 JPQL (Java持久性查询语言)基于方法名称的查询。该查询是从方法签名派生的。它设置绑定参数值,执行查询并返回结果。
还有其他一些功能,如下所示:
它可以集成自定义存储库代码。 这是一个功能强大的存储库和自定义对象映射抽象。 它支持透明审核。 它实现了提供基本属性的域基类。 它支持多个模块,例如Spring Data JPA,Spring Data MongoDB,Spring Data REST,Spring Data Cassandra等。
Spring Data JPA提供了 三个存储库,如下所示:
CrudRepository: : 它提供标准的创建,读取,更新和删除。它包含诸如 findOne(),findAll( ),save(),delete(),等。 PagingAndSortingRepository : 它扩展了 CrudRepository 并添加了findAll方法。它使我们能够以分页方式排序和检索数据。 JpaRepository : 这是一个 JPA特定存储库,它在 Spring Data Jpa 中定义。它扩展了存储库CrudRepository和PagingAndSortingRepository。它添加了特定于JPA的方法,例如 flush(),以在持久性上下文上触发刷新。
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.2.3.RELEASE</version> </dependency>
Spring Boot提供了 spring-boot-starter-data-jpa 依赖关系,以有效地将Spring应用程序与关系数据库连接。 spring-boot-starter-data-jpa在内部使用spring-boot-jpa依赖项(自Spring Boot版本1.5.3起)。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.2.2.RELEASE</version> </dependency>
数据库是用表/关系设计的。较早的方法(JDBC)涉及编写SQL查询。在JPA中,我们会将对象中的数据存储到表中,反之亦然。但是,JPA是由于不同的思维过程而演变的。
在JPA之前,ORM是更常用于指代这些框架的术语。这就是Hibernate被称为ORM框架的原因。
JPA允许我们将应用程序类映射到数据库中的表。
实体管理器: : 定义映射后,它将处理与数据库的所有交互。 JPQL(Java持久性查询语言): 它提供了一种编写查询以对实体执行搜索的方法。它不同于SQL查询。 JPQL查询已经了解实体之间定义的映射。如果需要,我们可以添加其他条件。 标准API : 它定义了一个基于Java的API以对数据库执行搜索。
Hibernate是JPA的实现。它是最流行的ORM框架,而JPA是定义规范的API。 Hibernate了解我们在对象和表之间添加的映射。它确保基于映射从数据库检索/存储数据。它还在JPA顶部提供了其他功能。
在此示例中,我们将使用spring-boot-starter-data- jpa依赖关系来创建与H2数据库的连接。
步骤1: 打开spring Initializr https://start.spring.io/。
步骤2: 提供 组名称。我们提供了 com.nhooo 。
步骤3: 提供 工件 ID。我们提供了 spring-boot-jpa-example。
步骤4: 添加依赖项: Spring Web,Spring Data JPA,和 H2数据库。
步骤5: 单击 生成按钮。当我们单击"生成"按钮时,它会将项目包装在 Jar 文件中,并将其下载到本地系统。
步骤6: 提取 Jar文件并将其粘贴到STS工作区中。
步骤7: 将项目文件夹导入STS。
文件->导入->现有Maven项目->浏览->选择文件夹spring-boot-jpa-example->完成
导入需要一些时间。
步骤8: 创建一个名为 com.nhooo.controller 的程序包在步骤 src/main/java 中。
步骤9: 在控制台中创建一个名称为 ControllerDemo 的Controller类。软件包 com.nhooo.controller 。
ControllerDemo.java
package com.nhooo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ControllerDemo { @RequestMapping("/") public String home() { return "home.jsp"; } }
步骤10: 在文件夹 src/main/java中创建另一个名为 com.nhooo.model 的软件包。
User。 Java
package com.nhooo.model; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="userdata") public class User { @Id private int id; private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUname() { return username; } public void setUname(String username) { this.username = username; } @Override public String toString() { return "User [id=" + id + ", uname=" + username + "]"; } }
现在,我们需要配置H2数据库。
步骤12: 打开 application.properties 文件并配置以下内容: 端口,启用H2控制台,数据源,和 URL。
application.properties
server.port=8085 spring.h2.console.enabled=true spring.datasource.plateform=h2 spring.datasource.url=jdbc:h2:mem:nhooo
步骤13: : 在文件夹 src/main/resources中创建一个 SQL 文件。
右键单击文件夹src/main/resources->新建->文件->提供 文件名->完成
我们提供了文件名 data.sql ,并将以下数据插入其中。
data.sql
insert into userdata values(101,'Tom'); insert into userdata values(102,'Andrew'); insert into userdata values(103,'Tony'); insert into userdata values(104,'Bob'); insert into userdata values(105,'Sam');
步骤14: : 在 src 文件夹中创建一个名称为 webapp 的文件夹。
步骤15: 使用我们在 ControllerDemo 中返回的名称创建一个JSP文件。在ControllerDemo.java中,我们返回了 home.jsp 。
home.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="addUser"> ID :<br /> <input type="text" name="t1"><br /> User name :<br /> <input type="text" name="t2"><br /> <input type="submit" value="Add"> </form> </body> </html>
步骤16: 运行 SpringBootJpaExampleApplication.java 文件。我们可以在控制台中看到我们的应用程序已在端口 8085 上成功运行。
步骤17: 打开浏览器并调用URL http: //localhost: 8085/h2-console/。它显示了驱动程序类,我们在 application.properties 文件中配置的JDBC URL和默认的用户名sa。
我们还可以通过单击 Test Connection 按钮来测试连接。如果连接成功,则显示消息"测试成功"。
步骤18: 单击 Connect (连接)按钮。它显示了我们在 User.java 中定义的表userdata的结构。
步骤19: 执行以下查询以查看我们已插入 data.sql 文件中的数据。
SELECT * FROM USERDATA;