Spring Data是一個(gè)高級(jí)Spring Source項(xiàng)目。其目的是統(tǒng)一并輕松訪問關(guān)系數(shù)據(jù)庫系統(tǒng)和NoSQL數(shù)據(jù)存儲(chǔ)等不同類型的持久性存儲(chǔ)。
在實(shí)現(xiàn)新應(yīng)用程序時(shí),我們應(yīng)該專注于業(yè)務(wù)邏輯而不是技術(shù)復(fù)雜性和樣板代碼。這就是Java持久性API(JPA)規(guī)范和Spring Data JPA非常受歡迎的原因。
Spring Data JPA在JPA的頂部增加了一層。這意味著,Spring Data JPA使用JPA規(guī)范定義的所有功能,尤其是實(shí)體,關(guān)聯(lián)映射和JPA的查詢功能。 Spring Data JPA添加了自己的功能,例如存儲(chǔ)庫模式的無代碼實(shí)現(xiàn)以及從方法名稱創(chuàng)建數(shù)據(jù)庫查詢。
Spring Data JPA處理大多數(shù)基于JDBC的數(shù)據(jù)庫訪問和ORM(對(duì)象關(guān)系映射)的復(fù)雜性。它減少了JPA所需的樣板代碼。
Spring Data JPA旨在通過減少所需的工作量來改進(jìn)數(shù)據(jù)訪問層的實(shí)現(xiàn)。
Spring Data JPA有 三個(gè)主要功能,如下所示:
無代碼存儲(chǔ)庫: 這是最流行的與持久性相關(guān)的模式。它使我們能夠在更高的抽象級(jí)別上實(shí)現(xiàn)業(yè)務(wù)代碼。 簡(jiǎn)化的樣板代碼: 它通過其存儲(chǔ)庫接口為每種方法提供默認(rèn)實(shí)現(xiàn)。這意味著不再需要實(shí)現(xiàn)讀寫操作。 生成的查詢: Spring Data JPA的另一個(gè)功能是根據(jù)方法名稱生成數(shù)據(jù)庫查詢。如果查詢不太復(fù)雜,則需要在存儲(chǔ)庫接口上定義一個(gè)以 findBy 開頭的名稱的方法。定義方法后,Spring解析方法名稱并為其創(chuàng)建查詢。例如:
public interface EmployeeRepository extends CrudRepository<Employee, Long> { Employee findByName(String name); }
在上面的示例中,我們擴(kuò)展了使用兩個(gè)泛型的 CrudRepository : Employee 和 Long 。 Employee是要管理的 實(shí)體,而 Long 是主鍵的數(shù)據(jù)類型
Spring內(nèi)部會(huì)生成 JPQL (Java持久性查詢語言)基于方法名稱的查詢。該查詢是從方法簽名派生的。它設(shè)置綁定參數(shù)值,執(zhí)行查詢并返回結(jié)果。
還有其他一些功能,如下所示:
它可以集成自定義存儲(chǔ)庫代碼。 這是一個(gè)功能強(qiáng)大的存儲(chǔ)庫和自定義對(duì)象映射抽象。 它支持透明審核。 它實(shí)現(xiàn)了提供基本屬性的域基類。 它支持多個(gè)模塊,例如Spring Data JPA,Spring Data MongoDB,Spring Data REST,Spring Data Cassandra等。
Spring Data JPA提供了 三個(gè)存儲(chǔ)庫,如下所示:
CrudRepository: : 它提供標(biāo)準(zhǔn)的創(chuàng)建,讀取,更新和刪除。它包含諸如 findOne(),findAll( ),save(),delete(),等。 PagingAndSortingRepository : 它擴(kuò)展了 CrudRepository 并添加了findAll方法。它使我們能夠以分頁方式排序和檢索數(shù)據(jù)。 JpaRepository : 這是一個(gè) JPA特定存儲(chǔ)庫,它在 Spring Data Jpa 中定義。它擴(kuò)展了存儲(chǔ)庫CrudRepository和PagingAndSortingRepository。它添加了特定于JPA的方法,例如 flush(),以在持久性上下文上觸發(fā)刷新。
<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 依賴關(guān)系,以有效地將Spring應(yīng)用程序與關(guān)系數(shù)據(jù)庫連接。 spring-boot-starter-data-jpa在內(nèi)部使用spring-boot-jpa依賴項(xiàng)(自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>
數(shù)據(jù)庫是用表/關(guān)系設(shè)計(jì)的。較早的方法(JDBC)涉及編寫SQL查詢。在JPA中,我們會(huì)將對(duì)象中的數(shù)據(jù)存儲(chǔ)到表中,反之亦然。但是,JPA是由于不同的思維過程而演變的。
在JPA之前,ORM是更常用于指代這些框架的術(shù)語。這就是Hibernate被稱為ORM框架的原因。
JPA允許我們將應(yīng)用程序類映射到數(shù)據(jù)庫中的表。
實(shí)體管理器: : 定義映射后,它將處理與數(shù)據(jù)庫的所有交互。 JPQL(Java持久性查詢語言): 它提供了一種編寫查詢以對(duì)實(shí)體執(zhí)行搜索的方法。它不同于SQL查詢。 JPQL查詢已經(jīng)了解實(shí)體之間定義的映射。如果需要,我們可以添加其他條件。 標(biāo)準(zhǔn)API : 它定義了一個(gè)基于Java的API以對(duì)數(shù)據(jù)庫執(zhí)行搜索。
Hibernate是JPA的實(shí)現(xiàn)。它是最流行的ORM框架,而JPA是定義規(guī)范的API。 Hibernate了解我們?cè)趯?duì)象和表之間添加的映射。它確?;谟成鋸臄?shù)據(jù)庫檢索/存儲(chǔ)數(shù)據(jù)。它還在JPA頂部提供了其他功能。
在此示例中,我們將使用spring-boot-starter-data- jpa依賴關(guān)系來創(chuàng)建與H2數(shù)據(jù)庫的連接。
步驟1: 打開spring Initializr https://start.spring.io/。
步驟2: 提供 組名稱。我們提供了 com.nhooo 。
步驟3: 提供 工件 ID。我們提供了 spring-boot-jpa-example。
步驟4: 添加依賴項(xiàng): Spring Web,Spring Data JPA,和 H2數(shù)據(jù)庫。
步驟5: 單擊 生成按鈕。當(dāng)我們單擊"生成"按鈕時(shí),它會(huì)將項(xiàng)目包裝在 Jar 文件中,并將其下載到本地系統(tǒng)。
步驟6: 提取 Jar文件并將其粘貼到STS工作區(qū)中。
步驟7: 將項(xiàng)目文件夾導(dǎo)入STS。
文件->導(dǎo)入->現(xiàn)有Maven項(xiàng)目->瀏覽->選擇文件夾spring-boot-jpa-example->完成
導(dǎo)入需要一些時(shí)間。
步驟8: 創(chuàng)建一個(gè)名為 com.nhooo.controller 的程序包在步驟 src/main/java 中。
步驟9: 在控制臺(tái)中創(chuàng)建一個(gè)名稱為 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中創(chuàng)建另一個(gè)名為 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 + "]"; } }
現(xiàn)在,我們需要配置H2數(shù)據(jù)庫。
步驟12: 打開 application.properties 文件并配置以下內(nèi)容: 端口,啟用H2控制臺(tái),數(shù)據(jù)源,和 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中創(chuàng)建一個(gè) SQL 文件。
右鍵單擊文件夾src/main/resources->新建->文件->提供 文件名->完成
我們提供了文件名 data.sql ,并將以下數(shù)據(jù)插入其中。
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 文件夾中創(chuàng)建一個(gè)名稱為 webapp 的文件夾。
步驟15: 使用我們?cè)? ControllerDemo 中返回的名稱創(chuàng)建一個(gè)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: 運(yùn)行 SpringBootJpaExampleApplication.java 文件。我們可以在控制臺(tái)中看到我們的應(yīng)用程序已在端口 8085 上成功運(yùn)行。
步驟17: 打開瀏覽器并調(diào)用URL http: //localhost: 8085/h2-console/。它顯示了驅(qū)動(dòng)程序類,我們?cè)? application.properties 文件中配置的JDBC URL和默認(rèn)的用戶名sa。
我們還可以通過單擊 Test Connection 按鈕來測(cè)試連接。如果連接成功,則顯示消息"測(cè)試成功"。
步驟18: 單擊 Connect (連接)按鈕。它顯示了我們?cè)? User.java 中定義的表userdata的結(jié)構(gòu)。
步驟19: 執(zhí)行以下查詢以查看我們已插入 data.sql 文件中的數(shù)據(jù)。
SELECT * FROM USERDATA;