本文教你開始使用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。這是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
中自動連線存儲庫。
此類具備簡單的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 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架構思惟導圖,分享給一樣正在認真學習的每位朋友~