使用Spring Data JPA的Spring Boot

本文教你開始使用Spring Data JPA。來自優銳課JAVA架構專業講師精心整理。java

歡迎使用帶有Spring Data JPA的Spring Boot教程!在本教程中,咱們將看到Spring Data JPA如何在DAO層上提供完整的抽象。咱們再也不須要爲DAO層編寫實現; Spring Data自動生成實現DAO實現。mysql

咱們已經對Spring Boot進行了介紹,在本教程中,咱們將結合使用Spring Boot和Spring Data。你還將看到Spring Boot自動配置如何幫助你輕鬆完成數據源配置。web

在咱們的Spring Boot Rest Service教程中,咱們建立了一個DogService,其中包括一個基於Mock Data Provider的簡單CRUD服務。咱們將使用相同的DogService,並使用實際的MySQL數據庫以及Spring Data和JPA替換Mock Data Provider。spring

依賴配置

在本教程中,我將MySQL數據庫與Spring Data一塊兒使用。 這是build.gradle文件:sql

 1 buildscript {
 2     ext {
 3         springBootVersion = '2.1.0.RELEASE'
 4     }
 5     repositories {
 6         mavenCentral()
 7     }
 8     dependencies {
 9         classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
10     }
11 }
12 apply plugin: 'java'
13 apply plugin: 'eclipse'
14 apply plugin: 'org.springframework.boot'
15 apply plugin: 'io.spring.dependency-management'
16 group = 'com.amitph.spring'
17 version = '0.0.1-SNAPSHOT'
18 sourceCompatibility = 1.8
19 repositories {
20     mavenCentral()
21 }
22 dependencies {
23     implementation('org.springframework.boot:spring-boot-starter-web')
24     compile("org.springframework.boot:spring-boot-starter-data-jpa")
25     compile('mysql:mysql-connector-java:8.0.13')
26     testImplementation('org.springframework.boot:spring-boot-starter-test')
27 }

 

 

數據源配置

如今,咱們已經配置了依賴項。如今還不應告訴要鏈接到哪一個數據源。這是個人帶有Spring Boot數據源條目的application.yml。數據庫

 1 spring:
 2   datasource:
 3     url: jdbc:mysql://localhost:33099/dogs
 4     password: <ENTER _ PASSWORD _ HERE >
 5     username: root
 6     driver-class-name: "com.mysql.jdbc.Driver"
 7   jpa:
 8     database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
 9     hibernate:
10       ddl-auto: update

 

在這裏,咱們具備指定的JDBC URL,用戶名,密碼和驅動程序類名稱(MySQL)。架構

除此以外,還有JPA特定的配置。首先是數據庫平臺,它告訴咱們在MySQL查詢方言下要考慮的基礎Hibernate功能。這樣,全部數據庫操做將以MySQL特定的語法處理。第二個JPA配置是ddl-auto,它告訴Hibernate建立各自的數據庫和表結構(若是還沒有存在的話)。app

啓用此選項後,Hibernate將基於實體Bean和數據源建立數據庫結構。eclipse

Entity Bean

咱們將要作的第一級代碼是編寫一個Entity Bean。這是Oracle文檔關於實體Bean的內容。maven

使用JPA,你能夠將任何POJO類指定爲JPA實體——使用從JPA持久性提供程序(在Java EE EJB容器內或外部)得到的實體管理器的服務,其非瞬態字段應持久保存到關係數據庫的Java對象。Java SE應用程序中的EJB容器)。

用簡單的話來講,JPA實體是任何Java POJO,均可以表示基礎表結構。因爲咱們的服務基於「Dog」表,所以咱們將建立一個「Dog」 實體對象。

 1 package com.amitph.spring.dogs.repo;
 2 import javax.persistence.Entity;
 3 import javax.persistence.GeneratedValue;
 4 import javax.persistence.Id;
 5 @Entity
 6 public class Dog {
 7     @Id
 8     @GeneratedValue
 9     private long id;
10     private String name;
11     private int age;
12     public long getId() {
13         return id;
14     }
15     public void setId(long id) {
16         this.id = id;
17     }
18     public String getName() {
19         return name;
20     }
21     public void setName(String name) {
22         this.name = name;
23     }
24     public int getAge() {
25         return age;
26     }
27     public void setAge(int age) {
28         this.age = age;
29     }
30 }

 

上面的POJO用@Entity註釋,表示這是表名Dog的實體對象。

而後,有三個字段表明數據表列。字段ID是咱們的主鍵,所以被標記爲@Id。

字段ID也用@GeneratedValue標記,表示這是一個自動增量列,Hibernate將負責輸入下一個值。Hibernate首先將查詢基礎表以瞭解該列的最大值,並在下一次插入時對其進行遞增。這也意味着咱們不須要爲Id列指定任何值,能夠將其留空。

 

倉庫接口

存儲庫表明DAO層,一般執行全部數據庫操做。感謝Spring Data,他提供了這些方法的實現。讓咱們看看咱們的DogsRepoisitory,它擴展了CrudRepository

1 package com.amitph.spring.dogs.repo;
2 import org.springframework.data.repository.CrudRepository;
3 import org.springframework.stereotype.Repository;
4 @Repository
5 public interface DogsRepository extends CrudRepository<Dog, Long> {}

 

DogsRepository中這裏沒有方法聲明。這是由於Spring Data的CrudInterface 已經聲明瞭基本的CRUD方法。

在這裏,咱們完成了JPA和Spring數據工做——換句話說,就是DAO層。如今,讓咱們編寫一個簡單的服務層和一個控制器。

 

控制器和服務層

完成數據訪問層後,咱們將編寫控制器和服務層。請注意,DogsRepository帶有@Repository註釋,這也將其添加到Spring Context中。如今,咱們能夠在Service中自動連線存儲庫。

Dogs Service

此類具備簡單的CRUD方法。還將Entity Bean轉換爲DTO(數據傳輸對象)。DTO仍是一個簡單的Java POJO,用於在系統之間傳輸數據。在這裏,咱們從REST端點返回DTO。

 1 package com.amitph.spring.dogs.service;
 2 import com.amitph.spring.dogs.model.DogDto;
 3 import com.amitph.spring.dogs.repo.Dog;
 4 import com.amitph.spring.dogs.repo.DogsRepository;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.stereotype.Component;
 7 import java.util.List;
 8 import java.util.Optional;
 9 @Component
10 public class DogsService {
11     @Autowired DogsRepository repository;
12     public void add(DogDto dto) {
13         repository.save(toEntity(dto));
14     }
15     public void delete(long id) {
16         repository.deleteById(id);
17     }
18     public List<Dog> getDogs() {
19         return (List<Dog>) repository.findAll();
20     }
21     public Dog getDogById(long id) {
22         Optional<Dog> optionalDog = repository.findById(id);
23         return optionalDog.orElseThrow(() -> new DogNotFoundException("Couldn't find a Dog with id: " + id));
24     }
25     private Dog toEntity(DogDto dto) {
26         Dog entity = new Dog();
27         entity.setName(dto.getName());
28         entity.setAge(dto.getAge());
29         return entity;
30     }
31 }

 

 

Dogs控制器

Dogs Controller是具備簡單CRUD端點的標準REST控制器。控制器的工做是處理HTTP請求並調用Service類方法。

 1 package com.amitph.spring.dogs.web;
 2 import com.amitph.spring.dogs.model.DogDto;
 3 import com.amitph.spring.dogs.repo.Dog;
 4 import com.amitph.spring.dogs.service.DogsService;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.web.bind.annotation.DeleteMapping;
 7 import org.springframework.web.bind.annotation.GetMapping;
 8 import org.springframework.web.bind.annotation.PathVariable;
 9 import org.springframework.web.bind.annotation.PostMapping;
10 import org.springframework.web.bind.annotation.RequestBody;
11 import org.springframework.web.bind.annotation.RequestMapping;
12 import org.springframework.web.bind.annotation.RestController;
13 import java.util.List;
14 @RestController
15 @RequestMapping("/dogs")
16 public class DogsController {
17     @Autowired DogsService service;
18     @GetMapping
19     public List<Dog> getDogs() {
20         return service.getDogs();
21     }
22     @PostMapping
23     public void postDogs(@RequestBody DogDto dto) {
24         service.add(dto);
25     }
26     @GetMapping("/{id}")
27     public Dog getById(@PathVariable(required = true) long id) {
28         return service.getDogById(id);
29     }
30     @DeleteMapping("/{id}")
31     public void delete(@PathVariable(required = true) long id) {
32         service.delete(id);
33     }
34 }

 

如今,Dogs Service已準備好運行。啓動應用程序並執行HTTP端點。

 

結論

Spring數據和JPA教程的Spring Boot到此結束。咱們看到了如何將Spring Data的抽象用於數據訪問層。咱們看到了如何以Entity Bean的形式表示數據庫表,以及如何使用Spring Data的自動生成的存儲庫實現。此外,咱們還看到了如何使用Spring Boot進行自動數據源配置。

在Spring Boot Rest Service帖子中,咱們已經看到了使用Spring Boot建立RESTful Web服務。在當前文章中,咱們不關心異常處理。訪問Spring Rest Service異常處理以瞭解有關處理異常的信息。咱們還跳過了這裏的單元測試部分,這將在之後的文章中介紹。

感謝閱讀!

另外近期整理了一套完整的java架構思惟導圖,分享給一樣正在認真學習的每位朋友~

相關文章
相關標籤/搜索