javascript
Spring Boot的Spring Data JPA示例
1.簡介
在本文中,我們將演示如何利用功能強大的Spring Data JPA API與本課程中的數(shù)據(jù)庫(內存中的H2數(shù)據(jù)庫)進行交互。
Spring Data JPA提供了一組非常強大且高度抽象的接口,用于與任何基礎數(shù)據(jù)庫進行交互。 數(shù)據(jù)庫可以是MySQL,MongoDB,Elasticsearch或任何其他受支持的數(shù)據(jù)庫。 Spring Data JPA的其他優(yōu)點包括:
- 支持根據(jù)JPA公約建立擴展存儲庫
- 內置分頁支持和動態(tài)查詢執(zhí)行
- 支持基于XML的實體映射
在此示例中,我們將使用H2內存數(shù)據(jù)庫。 數(shù)據(jù)庫的選擇不應影響我們將構建的Spring Data定義,因為這是Spring Data JPA提供的主要優(yōu)點。 它使我們能夠將數(shù)據(jù)庫查詢與應用程序邏輯完全分開。
2.項目設置
我們將使用許多Maven原型之一為我們的示例創(chuàng)建一個示例項目。 要創(chuàng)建項目,請在將用作工作空間的目錄中執(zhí)行以下命令:
mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=JCG-SpringDataJPA-example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false如果您是第一次運行maven,則完成生成命令將花費幾秒鐘,因為maven必須下載所有必需的插件和工件才能完成生成任務。
使用Maven的JPA項目設置
請注意,現(xiàn)在,您將在所選目錄中擁有一個與artifactId同名的新目錄。 現(xiàn)在,隨時在您喜歡的IDE中打開項目。
最后,我們使用一個簡單的maven命令來代替使用IDE來創(chuàng)建該項目。 這有助于我們使項目設置和初始化不受您可能使用的任何特定IDE的影響。
3. Maven依賴
首先,我們需要在項目中添加適當?shù)腗aven依賴項。 我們將以下依賴項添加到我們的pom.xml文件中:
pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version> </properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build>在此處找到與Spring相關的最新依賴項。
請注意,我們還在此處添加了H2數(shù)據(jù)庫依賴關系及其范圍(作為運行時),因為一旦應用程序停止運行,H2數(shù)據(jù)就會被沖走。 在本課程中,我們將不會關注H2的實際工作原理,而是將自己局限于Spring Data JPA API。 您可能還會看到我們如何使用Spring應用程序配置嵌入式H2控制臺 。
4.項目結構
在繼續(xù)進行并開始處理該項目的代碼之前,讓我們在此介紹一下將所有代碼添加到項目后將擁有的projet結構:
項目結構
我們將項目分為多個包,以便遵循關注點分離的原則,并且代碼保持模塊化。
5.定義模型
我們將在我們的項目中添加一個非常簡單的模型Person 。 它的定義將非常標準,例如:
人.java
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;@Entity public class Person {@Id@GeneratedValueprivate 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@Overridepublic String toString() {return String.format("Person{id=%d, name='%s', age=%d}", id, name, age);} }為了簡潔起見,我們省略了標準的getter和setter方法,但是由于Jackson在對象的序列化和反序列化過程中使用它們,因此必須將它們制成。
@Entity注釋將該POJO標記為對象,該對象將由Spring Data API管理,并且其字段將被視為表列(除非標記為transient )。
最后,我們?yōu)閠oString()方法添加了一個自定義實現(xiàn),以便在測試應用程序時可以打印相關數(shù)據(jù)。
6.定義JPA存儲庫
JPA為我們提供了一種非常簡單的定義JPA存儲庫接口的方法。
在了解如何定義JPA信息庫之前,我們需要記住,只有在利用與JPA相關的功能時,才使每個JPA接口與數(shù)據(jù)庫表的單個實體進行交互。 如果我們看一下接口定義,我們將對此有深刻的理解:
PersonRepository.java
import com.javacodegeeks.jpaexample.model.Person; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository;@Repository public interface PersonRepository extends JpaRepository<Person, Long> { }盡管上面的接口定義是空的,但我們仍然需要了解一些要點:
- @Repository批注將此接口標記為Spring Bean,該Bean在應用程序啟動時初始化。 借助此注釋,Spring可以管理異常數(shù)據(jù)庫交互引發(fā)的正常運行
- 我們使用Person作為參數(shù)來表示此JPA接口將管理Person實體
- 最后,我們還傳遞了數(shù)據(jù)類型Long作為參數(shù)。 這表示Person實體包含唯一標識符,其類型為Long
7.制作服務界面
在本節(jié)中,我們將定義一個服務接口,該接口將充當實現(xiàn)的合同,并重新表達我們的服務必須支持的所有操作。 這些動作將與結交新用戶以及獲取與數(shù)據(jù)庫中對象有關的信息有關。
這是我們將使用的合同定義:
PersonService.java
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操作以及分頁概念。
當我們引入基于pageSize和pageNumber從數(shù)據(jù)庫中獲取所有對象時,使用分頁API很重要。 pageSize屬性表示從數(shù)據(jù)庫中獲取的對象數(shù),而pageNumber屬性用作查詢的跳過部分。 有關Spring分頁如何工作的詳細課程,請閱讀本課程 。
8.提供服務實施
我們將使用上面的接口定義來提供其實現(xiàn),以便我們可以執(zhí)行與我們先前定義的Person實體相關的CRUD操作。 我們將在這里執(zhí)行:
PersonServiceImpl.java
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 {@Autowiredprivate PersonRepository personRepository;@Overridepublic Person createPerson(Person person) {return personRepository.save(person);}@Overridepublic Person getPerson(Long id) {return personRepository.findOne(id);}@Overridepublic Person editPerson(Person person) {return personRepository.save(person);}@Overridepublic void deletePerson(Person person) {personRepository.delete(person);}@Overridepublic void deletePerson(Long id) {personRepository.delete(id);}@Overridepublic List<Person> getAllPersons(int pageNumber, int pageSize) {return personRepository.findAll(new PageRequest(pageNumber, pageSize)).getContent();}@Overridepublic List<Person> getAllPersons() {return personRepository.findAll();}@Overridepublic long countPersons() {return personRepository.count();} }令人驚訝的是,所有方法實現(xiàn)都只是一行代碼。 這顯示了JPA存儲庫提供給我們的抽象級別。
上面的大多數(shù)操作都很容易理解。 需要注意的主要事情是,我們從未在存儲庫中提供過像getAllPersons()等那樣的任何方法! 那么這些方法是如何一起出現(xiàn)的呢? 答案還是在于JPA存儲庫提供給我們的抽象。 所有方法(如findAll() , delete() , save(...)等)都內置在我們在存儲庫接口定義中擴展的JpaRepository中。
9.使用CommandLineRunner
為了測試我們現(xiàn)在編寫的收費代碼以及數(shù)據(jù)庫交互部分,我們將在Spring Boot應用程序的主類中使用CommandLineRunner 。 CommandLineRunner在Spring Boot應用程序的main()方法被調用之前運行,因此,它是執(zhí)行任何初始化步驟或測試代碼的理想空間。
為了測試應用程序,我們將使用服務bean在我們的類中執(zhí)行數(shù)據(jù)庫操作:
pom.xml
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; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class DataJpaApp implements CommandLineRunner {private static final Logger LOG = LoggerFactory.getLogger("JCG");@Autowiredprivate PersonService service;public static void main(String[] args) {SpringApplication.run(DataJpaApp.class, args);}@Overridepublic void run(String... strings) {LOG.info("Current objects in DB: {}", service.countPersons());Person person = service.createPerson(new Person("Shubham", 23));LOG.info("Person created in DB : {}", person);LOG.info("Current objects in DB: {}", service.countPersons());person.setName("Programmer");Person editedPerson = service.editPerson(person);LOG.info("Person edited in DB : {}", person);service.deletePerson(person);LOG.info("After deletion, count: {}", service.countPersons());} }在上面的示例代碼中,我們只是簡單地調用了我們在服務中創(chuàng)建的一些重要方法,例如創(chuàng)建了一些數(shù)據(jù)并在以后的方法調用中對其進行了訪問。
現(xiàn)在,我們最終將使用Maven本身運行我們的項目(再次獨立于任何IDE來運行我們的項目)。
10.運行應用程序
使用maven可以輕松運行應用程序,只需使用以下命令:
運行應用程序
mvn spring-boot:run一旦運行項目,我們將看到以下輸出:
數(shù)據(jù)JPA項目輸出
如預期的那樣,我們首先創(chuàng)建了一些樣本數(shù)據(jù),并通過調用count()方法調用對其進行了確認。 最后,我們刪除了數(shù)據(jù),并再次通過count()方法調用進行了確認。
11.下載源代碼
這是Spring Boot和Spring Data JPA API以及內存中H2數(shù)據(jù)庫的示例。
下載您可以在此處下載此示例的完整源代碼: Spring Data JPA示例
翻譯自: https://www.javacodegeeks.com/2018/03/spring-data-jpa-example-with-spring-boot.html
總結
以上是生活随笔為你收集整理的Spring Boot的Spring Data JPA示例的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 思科路由器模拟器思科模拟软件如何配置路由
- 下一篇: 电脑蓝屏怎么修复电脑如何修复蓝屏
