Spring数据JPA

Spring Data JPA(Spring数据JPA)是一个高级的Spring源项目。它的目的是统一和简化对不同类型的持久化存储(包括关系型数据库系统和NoSQL数据存储)的访问。

当我们实现一个新的应用程序时,应该将重点放在业务逻辑上,而不是技术复杂性和样板代码上。这就是为什么Java持久化API(JPA)规范和Spring Data JPA非常受欢迎。

Spring Data JPA在JPA之上添加了一层。这意味着Spring Data JPA使用了JPA规范定义的所有特性,特别是实体、关联映射和JPA的查询能力。Spring Data JPA还添加了自己的特性,例如无代码实现存储库模式和根据方法名称创建数据库查询。

Spring Data JPA(Spring数据JPA)是一个高级的Spring源项目。它的目的是统一和简化对不同类型的持久化存储(包括关系型数据库系统和NoSQL数据存储)的访问。

当我们实现一个新的应用程序时,应该将重点放在业务逻辑上,而不是技术复杂性和样板代码上。这就是为什么Java持久化API(JPA)规范和Spring Data JPA非常受欢迎。

Spring Data JPA在JPA之上添加了一层。这意味着Spring Data JPA使用了JPA规范定义的所有特性,特别是实体、关联映射和JPA的查询能力。Spring Data JPA还添加了自己的特性,例如无代码实现存储库模式和根据方法名称创建数据库查询。

Spring Data JPA

Spring Data JPA处理了大部分基于JDBC的数据库访问和ORM(对象关系映射)的复杂性。它减少了JPA所需的样板代码。它使持久化层的实现更加简单和快速。

Spring Data 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 Repository

Spring Data JPA提供了三种不同的Repository接口,如下所示:

  1. CrudRepository:它提供了标准的创建、读取、更新和删除操作。包含方法如findOne()、findAll()、save()、delete()等。
  2. PagingAndSortingRepository:它扩展了CrudRepository,并添加了findAll()方法。它允许我们以分页的方式排序和检索数据。
  3. 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 Starter Data JPA

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允许我们将应用程序类映射到数据库中的表。

  1. 实体管理器(Entity Manager):一旦我们定义了映射,它处理与数据库的所有交互。
  2. JPQL(Java持久化查询语言):它提供了一种编写查询以执行针对实体的搜索的方式。它与SQL查询不同。JPQL查询已经理解了在实体之间定义的映射。如果需要,我们可以添加额外的条件。
  3. Criteria API:它定义了一种基于Java的API,用于执行针对数据库的搜索。

Hibernate vs. JPA

Hibernate是JPA的实现。它是最流行的ORM框架,而JPA是定义规范的API。Hibernate理解我们在对象和表之间添加的映射。它确保根据映射从数据库检索/存储数据。它还在JPA的基础上提供了其他功能。

Spring Boot JPA示例

在这个示例中,我们将使用spring-boot-starter-data-jpa依赖项与H2数据库建立连接。

步骤1:打开Spring Initializr https://start.spring.io/

步骤2:提供Group名称。我们提供了cn.javatiku。

步骤3:提供Artifact Id。我们提供了spring-boot-jpa-example。

步骤4:添加依赖项:Spring Web、Spring Data JPA和H2数据库。

步骤5:点击Generate按钮。当我们点击Generate按钮时,它会将项目打包为Jar文件并下载到本地系统。

f5b0ee0d6f34e984fcea982d79d9170.png

步骤6:解压Jar文件并将其粘贴到STS工作区中。

步骤7:将项目文件夹导入到STS中。

文件 -> 导入 -> 存在的Maven项目 -> 浏览 -> 选择文件夹spring-boot-jpa-example -> 完成

导入需要一些时间。

步骤8:在src/main/java文件夹中创建名为cn.javatiku.controller的包。

步骤9:在cn.javatiku.controller包中创建名为ControllerDemo的Controller类。

ControllerDemo.java

package cn.javatiku.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文件夹中创建名为cn.javatiku.model的另一个包。

步骤11:在cn.javatiku.model包中创建名为User的类。

User.java

package cn.javatiku.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:javatpoint

步骤13:在src/main/resources文件夹中创建一个SQL文件。

右键单击文件夹src/main/resources -> 新建 -> 文件 -> 提供文件名 -> 完成

我们提供了文件名data.sql,并将以下数据插入其中。

data.sql

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:创建一个JSP文件,其名称与我们在ControllerDemo中返回的名称相同。在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上。
b99ddac0925dffdf479d99a561061e3.png

步骤17:打开浏览器,输入URL http://localhost:8085/h2-console/。它会显示在application.properties文件中配置的驱动程序类、JDBC URL,以及默认的用户名sa。

9e9e97d804097a7ff434d64ab2fa761.png

步骤17:我们还可以通过点击“Test Connection”按钮来测试连接。如果连接成功,它会显示“Test Successful”消息。

步骤18:点击“Connect”按钮。它会显示我们在User.java中定义的表userdata的结构。

c901c3114ba14276560863ba4d029c2.png

步骤19:执行以下查询以查看我们在data.sql文件中插入的数据

SELECT * FROM USERDATA;

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot技术, 学习指南