新聞中心
一、簡介
在這篇文章中,我們將演示如何利用強大的Spring Data JPA API 與數(shù)據(jù)庫交互,本課的內(nèi)存H2 數(shù)據(jù)庫。

十載的咸陽網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整咸陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“咸陽網(wǎng)站設計”,“咸陽網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
Spring Data JPA 提供了一組非常強大且高度抽象的接口,用于與任何底層數(shù)據(jù)庫進行交互。數(shù)據(jù)庫可以是 MySQL、MongoDB、Elasticsearch 或任何其他支持的數(shù)據(jù)庫。Spring Data JPA 的其他優(yōu)勢包括:
- 支持基于 JPA 約定構建擴展存儲庫。
- 內(nèi)置分頁支持和動態(tài)查詢執(zhí)行。
- 支持基于 XML 的實體映射。
在本例中,我們將使用 H2 內(nèi)存數(shù)據(jù)庫。數(shù)據(jù)庫的選擇不應影響我們將構建的 Spring Data 定義,因為這是 Spring Data JPA 提供的主要優(yōu)勢。它使我們能夠?qū)?shù)據(jù)庫查詢與應用程序邏輯完全分離。
二、項目設置
我們將使用眾多 Maven 原型之一來為我們的示例創(chuàng)建一個示例項目。要創(chuàng)建項目,請在您將用作工作區(qū)的目錄中執(zhí)行以下命令:
mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=JCG-SpringDataJPA-example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
如果您是第一次運行 maven,則需要幾秒鐘來完成生成命令,因為 maven 必須下載所有必需的插件和工件才能完成生成任務。
artifactId請注意,現(xiàn)在,您將擁有一個與所選目錄同名的新目錄。現(xiàn)在,請隨意在您最喜歡的 IDE 中打開該項目。
最后,我們沒有使用 IDE 來制作這個項目,而是使用了一個簡單的 maven 命令。這有助于我們從您可能使用的任何特定 IDE 中進行項目設置和初始化。
三、 Maven依賴
首先,我們需要將適當?shù)?Maven 依賴項添加到我們的項目中。我們將以下依賴項添加到我們的pom.xml文件中:
pom.xml
<父>
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
父>
<屬性>
UTF-8
UTF-8
1.8
屬性>
<依賴項>
<依賴>
org.springframework.boot
spring-boot-starter-data-jpa
依賴>
<依賴>
org.springframework.boot
spring-boot-starter-web
依賴>
<依賴>
com.h2database
h2
運行時
依賴>
<依賴>
org.springframework.boot
spring-boot-starter-test
測試
依賴>
依賴>
<構建>
<插件>
<插件>
org.springframework.boot
spring-boot-maven-plugin
插件>
插件>
請注意,我們還在此處添加了 H2 數(shù)據(jù)庫依賴項,并將其范圍作為運行時,因為一旦應用程序停止,H2 數(shù)據(jù)就會被沖走。在本課中,我們不會關注 H2 的實際工作方式,而是將自己限制在 Spring Data JPA API 上。
四、項目結(jié)構
在我們繼續(xù)開始為項目編寫代碼之前,讓我們在這里展示一下在將所有代碼添加到項目后我們將擁有的項目結(jié)構:
我們將項目分成多個包,遵循關注點分離的原則,代碼保持模塊化。
五、定義模型
我們將首先在我們的項目中添加一個非常簡單的模型,a Person. 它的定義將非常標準,例如:
人.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//standard getters and setters
@Override
public String toString() {
return String.format("Person{id=%d, name='%s', age=%d}", id, name, age);
}
}
為簡潔起見,我們省略了標準的 getter 和 setter,但它們是必要的,因為 Jackson 在對象的序列化和反序列化期間使用它們。
注釋將此 POJO 標記為將由 Spring Data API 管理的@Entity對象,并且其字段將被視為表列(除非標記為transient)。
最后,我們?yōu)樵搕oString()方法添加了一個自定義實現(xiàn),以便我們在測試應用程序時可以打印相關數(shù)據(jù)。
六、 定義 JPA 存儲庫
JPA 為我們提供了一種非常簡單的方式來定義 JPA Repository 接口。
在了解如何定義 JPA 存儲庫之前,我們需要記住,每個 JPA 接口僅在利用 JPA 相關功能時與數(shù)據(jù)庫表的單個實體交互。如果我們看一下接口定義,我們會深刻理解這一點:
import com.javacodegeeks.jpaexample.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonRepository extends JpaRepository{
}
雖然上面的接口定義是空的,但我們還是有幾點需要理解:
- @Repository注釋將此接口標記為在應用程序啟動時初始化的 Spring Bean。有了這個注解,Spring 可以優(yōu)雅地管理異常數(shù)據(jù)庫交互拋出。
- 我們用作Person參數(shù)來表示此 JPA 接口將管理Person實體。
- 最后,我們還將數(shù)據(jù)類型Long作為參數(shù)傳遞。這表示該Person實體包含一個唯一標識符,該標識符屬于Long。
七、制作Service接口
在本節(jié)中,我們將定義一個服務接口,它將充當實現(xiàn)的合同,并代表我們的服務必須支持的所有操作。這些操作將與創(chuàng)建新用戶和獲取與數(shù)據(jù)庫中的對象相關的信息有關。
這是我們將使用的合約定義:
import com.javacodegeeks.jpaexample.model.Person;
import java.util.List;
public interface PersonService {
Person createPerson(Person person);
Person getPerson(Long id);
Person editPerson(Person person);
void deletePerson(Person person);
void deletePerson(Long id);
List getAllPersons(int pageNumber, int pageSize);
List getAllPersons();
long countPersons();
}
我們在本合同中提到了所有四個 CRUD 操作以及分頁的概念。
當我們介紹基于 apageSize和 a從數(shù)據(jù)庫中獲取所有對象時,創(chuàng)建分頁 API 很重要pageNumber。該pageSize屬性表示從數(shù)據(jù)庫中獲取的對象的數(shù)量,而該pageNumber屬性充當查詢的跳過部分。
八、 提供服務實施
我們將使用上面的接口定義來提供它的實現(xiàn),以便我們可以執(zhí)行與Person我們之前定義的實體相關的 CRUD 操作。我們將在這里進行:
import com.javacodegeeks.jpaexample.model.Person;
import com.javacodegeeks.jpaexample.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonRepository personRepository;
@Override
public Person createPerson(Person person) {
return personRepository.save(person);
}
@Override
public Person getPerson(Long id) {
return personRepository.findOne(id);
}
@Override
public Person editPerson(Person person) {
return personRepository.save(person);
}
@Override
public void deletePerson(Person person) {
personRepository.delete(person);
}
@Override
public void deletePerson(Long id) {
personRepository.delete(id);
}
@Override
public ListgetAllPersons(int pageNumber, int pageSize) {
return personRepository.findAll(new PageRequest(pageNumber, pageSize)).getContent();
}
@Override
public ListgetAllPersons() {
return personRepository.findAll();
}
@Override
public long countPersons() {
return personRepository.count();
}
}
令人驚訝的是,所有的方法實現(xiàn)都只是一行代碼。這顯示了 JPA 存儲庫提供給我們的抽象級別。
上面的大部分操作都很容易理解。需要注意的主要事情是,我們從未在我們制作的 Repository 中提供任何方法getAllPersons()等!那么這些方法是如何出現(xiàn)的呢?再次,答案在于 JPA Repositories 提供給我們的抽象。像findAll(),delete()等所有方法save(...)都內(nèi)置在JpaRepository我們在存儲庫接口定義中擴展的方法中。
九、 使用 CommandLineRunner
為了測試我們現(xiàn)在編寫的所有代碼以及數(shù)據(jù)庫交互部分,我們將CommandLineRunner在 Spring Boot 應用程序的主類中使用 。A在調(diào)用 Spring Boot 應用程序CommandLineRunner的方法之前運行main(),因此它是執(zhí)行任何初始化步驟或測試代碼的理想空間。
為了測試應用程序,我們將使用服務 bean 在我們的類中執(zhí)行數(shù)據(jù)庫操作:
import com.javacodegeeks.jpaexample.model.Person;
import com.javacodegeeks.jpaexample.service.PersonService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; 新聞名稱:帶有SpringBoot的SpringDataJPA示例
網(wǎng)頁地址:http://www.5511xx.com/article/cdgpeog.html


咨詢
建站咨詢
