Spring Data是高级Spring Source项目。 其目的是统一访问访问关系数据库系统和NoSQL数据存储等各种持久性存储。
当我们实现一个新的应用程序时,应该专注于业务逻辑,而不是技术复杂性和样板代码。这就是为什么Java Persistent API(JPA)规范和Spring Data JPA非常受欢迎的原因。
Spring Data JPA在JPA的顶部添加了一层。 这意味着Spring Data JPA使用JPA规范定义的所有功能,尤其是实体,关联映射和JPA的查询功能。 Spring Data JPA添加了自己的功能,例如存储库模式的无代码实现以及根据方法名称创建数据库查询。
1.Spring Data JPA
Spring Data JPA处理大多数基于JDBC的数据库访问和ORM(对象关系映射)的复杂性。它减少了JPA所需的样板代码。它使持久层代码的实现更加轻松快捷。
Spring Data JPA旨在通过减少所需的工作量来改善数据访问层的实现。
2.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
等。
3.Spring数据存储库
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>
4.Spring Boot Starter数据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用于将应用程序类映射到数据库中的表。
实体管理器:定义映射后,它将处理与数据库的所有交互。
JPQL(Java持久性查询语言):它提供了一种编写查询以对实体执行搜索的方法。 它不同于SQL查询。 JPQL查询已经了解实体之间定义的映射。 如果需要可以添加其他条件。
标准API:它定义了一个基于Java的API来对数据库执行搜索。
4.1.Hibernate与JPA
Hibernate是JPA的实现。 它是最流行的ORM框架,而JPA是定义规范的API。 Hibernate了解我们在对象和表之间添加的映射。它确保基于映射从数据库检索/存储数据。 它还在JPA顶部提供了其他功能。
4.2.Spring Boot JPA示例
在此示例中,我们将使用spring-boot-starter-data-jpa
依赖关系来创建与H2数据库的连接。
第1步:打开spring Initializr https://start.spring.io/
。
第2步:提供群组(Group)名称,这里填写:com.xntutor
。
第3步:提供工件ID(Artifact),这里填写:spring-boot-jpa-example
。
第4步:添加依赖项:Spring Web,Spring Data JPA和H2数据库。
第5步:点击Generate(生成)按钮。当单击Generate按钮时,它将项目封装在Jar文件中并将其下载到本地系统。
第6步:提取Jar文件并将其粘贴到STS工作区中。
第7步:将项目文件夹导入STS。
操作顺序:File -> Import -> Existing Maven Projects -> Browse -> Select the folder spring-boot-jpa-example -> Finish
导入可能需要一些时间。
第8步:在src/main/java
文件夹中创建一个名称为com.xntutor.controller
的包。
第9步:在包com.xntutor.controller
中创建一个名称为ControllerDemo
的Controller类。
文件:ControllerDemo.java
package com.xntutor.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.xntutor.model
的包。
第11步:在com.xntutor.model
包中创建一个名为User
的类。
文件:User.java
package com.xntutor.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步:在com.xntutor.model
包中创建一个名为User
的类。
打开application.properties
文件并配置以下内容:端口,启用H2控制台,数据源和URL。
文件:application.properties
server.port=8085
spring.h2.console.enabled=true
spring.datasource.plateform=h2
spring.datasource.url=jdbc:h2:mem:xntdb
第13步:在文件夹src/main/resources
中创建一个SQL文件。
右键单击文件夹src/main/resources -> New -> File -> Provide the File name -> Finish
创建的新文件名为:data.sql,数据内容如下所示:
文件:data.sql
insert into userdata values(101,'李四');
insert into userdata values(102,'Xnt');
insert into userdata values(103,'Xntuser');
insert into userdata values(104,'王五');
insert into userdata values(105,'张三');
第14步:在src
文件夹中创建一个名称为webapp
的文件夹。
第15步:使用在ControllerDemo
中返回的名称是创建的JSP文件名称。 在ControllerDemo.java实现代码中返回home.jsp
。
文件:home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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="添加">
</form>
</body>
</html>
第16步:运行SpringBootJpaExampleApplication.java
文件,可以在控制台中看到应用程序已在端口8085上成功运行。
第17步:打开浏览器并调用URL => http://localhost:8085/h2-console/
。 它显示了驱动程序类,在application.properties
文件中配置的JDBC URL和默认的用户名是:sa
。
也可以通过单击“测试连接”按钮来测试连接。 如果连接成功,则显示消息“测试成功”。
第18步:点击Connect(连接)按钮。 它显示了在User.java
中定义的表userdata
的结构。
第19步:执行以下查询以查看已插入到data.sql
文件中的数据。
SELECT * FROM USERDATA;
查询结果如下所示: