
本指南將引導您完成構建應用程序的過程,該應用程序使用 Spring Data JPA 在關系數據庫中存儲和檢索數據。
您將構建一個應用程序,用于在基于內存的數據庫中存儲 POJO(普通舊 Java 對象)。??Customer?
?
像大多數春天一樣入門指南,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設置步驟。無論哪種方式,您最終都會得到工作代碼。
(相關資料圖)
要從頭開始,請繼續(xù)從 Spring 初始化開始.
要跳過基礎知識,請執(zhí)行以下操作:
下載并解壓縮本指南的源存儲庫,或使用吉特:git clonehttps://github.com/spring-guides/gs-accessing-data-jpa.git
光盤成gs-accessing-data-jpa/initial
跳轉到定義簡單實體.完成后,您可以根據 中的代碼檢查結果。??gs-accessing-data-jpa/complete?
?
你可以使用這個預初始化項目,然后單擊生成以下載 ZIP 文件。此項目配置為適合本教程中的示例。
手動初始化項目:
導航到https://start.spring.io.此服務拉入應用程序所需的所有依賴項,并為您完成大部分設置。選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。單擊依賴關系并選擇Spring Data JPA,然后選擇H2 數據庫。單擊生成。下載生成的 ZIP 文件,該文件是配置了您選擇的 Web 應用程序的存檔。如果您的 IDE 集成了 Spring Initializr,則可以從 IDE 完成此過程。 |
您也可以從 Github 分叉項目,然后在 IDE 或其他編輯器中打開它。 |
在此示例中,您將存儲對象,每個對象都作為 JPA 實體進行批注。下面的清單顯示了 Customer 類 (in ):??Customer?
???src/main/java/com/example/accessingdatajpa/Customer.java?
?
package com.example.accessingdatajpa;import jakarta.persistence.Entity;import jakarta.persistence.GeneratedValue;import jakarta.persistence.GenerationType;import jakarta.persistence.Id;@Entitypublic class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; protected Customer() {} public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%d, firstName="%s", lastName="%s"]", id, firstName, lastName); } public Long getId() { return id; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; }}
這里有一個具有三個屬性的類:、 和 。您還有兩個構造函數。默認構造函數的存在只是為了 JPA。您不直接使用它,因此它被指定為 .另一個構造函數是用于創(chuàng)建要保存到數據庫的實例的構造函數。??Customer?
???id?
???firstName?
???lastName?
???protected?
???Customer?
?
該類用 注釋,表示它是一個 JPA 實體。(由于不存在批注,因此假定此實體映射到名為 .??Customer?
???@Entity?
???@Table?
???Customer?
?
對象的屬性被批注,以便 JPA 將其識別為對象的 ID。該屬性還帶有批注,以指示應自動生成 ID。??Customer?
???id?
???@Id?
???id?
???@GeneratedValue?
?
其他兩個屬性 和 不帶批注。假定它們映射到與屬性本身共享相同名稱的列。??firstName?
???lastName?
?
方便的方法打印出客戶的財產。??toString()?
?
Spring Data JPA專注于使用JPA將數據存儲在關系數據庫中。它最引人注目的功能是能夠在運行時從存儲庫界面自動創(chuàng)建存儲庫實現。
若要了解其工作原理,請創(chuàng)建與實體一起使用的存儲庫界面,如以下清單 (in ) 所示:??Customer?
???src/main/java/com/example/accessingdatajpa/CustomerRepository.java?
?
package com.example.accessingdatajpa;import java.util.List;import org.springframework.data.repository.CrudRepository;public interface CustomerRepository extends CrudRepository{ List findByLastName(String lastName); Customer findById(long id);}
??CustomerRepository?
?擴展接口。它使用的實體類型和 ID 和 在 上的泛型參數中指定。通過擴展 ,繼承了幾種使用持久性的方法,包括保存、刪除和查找實體的方法。??CrudRepository?
???Customer?
???Long?
???CrudRepository?
???CrudRepository?
???CustomerRepository?
???Customer?
???Customer?
?
Spring Data JPA 還允許您通過聲明其方法簽名來定義其他查詢方法。例如,包括方法。??CustomerRepository?
???findByLastName()?
?
在典型的 Java 應用程序中,您可能希望編寫一個實現 .然而,這就是Spring Data JPA如此強大的原因:你不需要編寫存儲庫接口的實現。Spring Data JPA在運行應用程序時創(chuàng)建一個實現。??CustomerRepository?
?
現在你可以連接這個例子,看看它是什么樣子的!
Spring Initializr 為應用程序創(chuàng)建了一個簡單的類。下面的清單顯示了 Initializr 為此示例創(chuàng)建的類(在 中):??src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java?
?
package com.example.accessingdatajpa;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class AccessingDataJpaApplication { public static void main(String[] args) { SpringApplication.run(AccessingDataJpaApplication.class, args); }}
??@SpringBootApplication?
?是一個方便的注釋,它添加了以下所有內容:
?@Configuration?
?:將類標記為應用程序上下文的 Bean 定義源。??@EnableAutoConfiguration?
?:告訴 Spring 引導根據類路徑設置、其他 bean 和各種屬性設置開始添加 bean。例如,如果 在類路徑上,則此注釋會將應用程序標記為 Web 應用程序并激活關鍵行為,例如設置 .spring-webmvc
DispatcherServlet
??@ComponentScan?
?:告訴 Spring 在包中查找其他組件、配置和服務,讓它找到控制器。com/example
該方法使用 Spring Boot 的方法啟動應用程序。您是否注意到沒有一行 XML?也沒有文件。此 Web 應用程序是 100% 純 Java,您無需處理配置任何管道或基礎結構。??main()?
???SpringApplication.run()?
???web.xml?
?
現在,您需要修改初始化者為您創(chuàng)建的簡單類。要獲取輸出(在本例中為控制臺),您需要設置一個記錄器。然后,您需要設置一些數據并使用它來生成輸出。以下清單顯示了已完成的類(在 中):??AccessingDataJpaApplication?
???src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java?
?
package com.example.accessingdatajpa;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;@SpringBootApplicationpublic class AccessingDataJpaApplication { private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class); public static void main(String[] args) { SpringApplication.run(AccessingDataJpaApplication.class); } @Bean public CommandLineRunner demo(CustomerRepository repository) { return (args) -> { // save a few customers repository.save(new Customer("Jack", "Bauer")); repository.save(new Customer("Chloe", "O"Brian")); repository.save(new Customer("Kim", "Bauer")); repository.save(new Customer("David", "Palmer")); repository.save(new Customer("Michelle", "Dessler")); // fetch all customers log.info("Customers found with findAll():"); log.info("-------------------------------"); for (Customer customer : repository.findAll()) { log.info(customer.toString()); } log.info(""); // fetch an individual customer by ID Customer customer = repository.findById(1L); log.info("Customer found with findById(1L):"); log.info("--------------------------------"); log.info(customer.toString()); log.info(""); // fetch customers by last name log.info("Customer found with findByLastName("Bauer"):"); log.info("--------------------------------------------"); repository.findByLastName("Bauer").forEach(bauer -> { log.info(bauer.toString()); }); // for (Customer bauer : repository.findByLastName("Bauer")) { // log.info(bauer.toString()); // } log.info(""); }; }}
該類包含一個通過一些測試的方法。首先,它從 Spring 應用程序上下文中獲取。然后,它保存一些對象,演示方法并設置一些要使用的數據。接下來,它調用從數據庫中獲取所有對象。然后它調用按其 ID 獲取單個。最后,它調用查找所有姓氏為“Bauer”的客戶。該方法返回一個 Bean,該 Bean 在應用程序啟動時自動運行代碼。??AccessingDataJpaApplication?
???demo()?
???CustomerRepository?
???CustomerRepository?
???Customer?
???save()?
???findAll()?
???Customer?
???findById()?
???Customer?
???findByLastName()?
???demo()?
???CommandLineRunner?
?
缺省情況下,Spring 引導啟用 JPA 存儲庫支持,并查找包(及其子包)所在的位置。如果您的配置具有位于不可見的包中的 JPA 存儲庫接口定義,那么可以使用 及其類型安全參數指出備用包。? |
您可以使用 Gradle 或 Maven 從命令行運行應用程序。您還可以構建一個包含所有必需依賴項、類和資源的可執(zhí)行 JAR 文件并運行該文件。通過構建可執(zhí)行 jar,可以輕松地在整個開發(fā)生命周期中跨不同環(huán)境等將服務作為應用程序進行交付、版本控制和部署。
如果使用 Gradle,則可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后運行該文件,如下所示:??./gradlew bootRun?
???./gradlew build?
?
java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar
如果使用 Maven,則可以使用 運行應用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后運行該文件,如下所示:??./mvnw spring-boot:run?
???./mvnw clean package?
?
java -jar target/gs-accessing-data-jpa-0.1.0.jar
此處描述的步驟將創(chuàng)建一個可運行的 JAR。你也可以構建經典 WAR 文件. |
運行應用程序時,應看到類似于以下內容的輸出:
== Customers found with findAll():Customer[id=1, firstName="Jack", lastName="Bauer"]Customer[id=2, firstName="Chloe", lastName="O"Brian"]Customer[id=3, firstName="Kim", lastName="Bauer"]Customer[id=4, firstName="David", lastName="Palmer"]Customer[id=5, firstName="Michelle", lastName="Dessler"]== Customer found with findById(1L):Customer[id=1, firstName="Jack", lastName="Bauer"]== Customer found with findByLastName("Bauer"):Customer[id=1, firstName="Jack", lastName="Bauer"]Customer[id=3, firstName="Kim", lastName="Bauer"]
祝賀!您已經編寫了一個簡單的應用程序,該應用程序使用 Spring Data JPA 將對象保存到數據庫中并從中獲取它們,所有這些都無需編寫具體的存儲庫實現。