每日消息!構建一個應用程序,用于在基于內存的數據庫中存儲 POJO(普通舊 Java 對象)

2022-12-20 15:12:15 來源:51CTO博客

本指南將引導您完成構建應用程序的過程,該應用程序使用 Spring Data JPA 在關系數據庫中存儲和檢索數據。

您將構建什么

您將構建一個應用程序,用于在基于內存的數據庫中存儲 POJO(普通舊 Java 對象)。??Customer??

你需要什么

約15分鐘最喜歡的文本編輯器或 IDEJDK 1.8或以后格拉德爾 4+或梅文 3.2+您也可以將代碼直接導入到 IDE 中:彈簧工具套件 (STS)智能理念VSCode

如何完成本指南

像大多數春天一樣入門指南,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設置步驟。無論哪種方式,您最終都會得到工作代碼。


(相關資料圖)

從頭開始,請繼續(xù)從 Spring 初始化開始.

跳過基礎知識,請執(zhí)行以下操作:

下載并解壓縮本指南的源存儲庫,或使用吉特:git clonehttps://github.com/spring-guides/gs-accessing-data-jpa.git光盤成gs-accessing-data-jpa/initial跳轉到定義簡單實體.

完成后,您可以根據 中的代碼檢查結果。??gs-accessing-data-jpa/complete??

從 Spring 初始化開始

你可以使用這個預初始化項目,然后單擊生成以下載 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()??

創(chuàng)建簡單查詢

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??

現在你可以連接這個例子,看看它是什么樣子的!

創(chuàng)建應用程序類

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-webmvcDispatcherServlet??@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 存儲庫接口定義,那么可以使用 及其類型安全參數指出備用包。??@SpringBootApplication????@EnableJpaRepositories????basePackageClasses=MyRepository.class??

構建可執(zhí)行的 JAR

您可以使用 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 將對象保存到數據庫中并從中獲取它們,所有這些都無需編寫具體的存儲庫實現。

標簽: 應用程序 構造函數 從頭開始

上一篇:生產環(huán)境 Redis 優(yōu)化記錄
下一篇:Python之?向對象其它