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

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


咨詢
建站咨詢
