本指南將引導(dǎo)您完成構(gòu)建應(yīng)用程序的過程,該應(yīng)用程序使用#spring# #spring認(rèn)證# Spring Data JPA 在關(guān)系數(shù)據(jù)庫中存儲和檢索數(shù)據(jù)。
你將建造什么
您將構(gòu)建一個(gè)將CustomerPOJO(普通舊 Java 對象)存儲在基于內(nèi)存的數(shù)據(jù)庫中的應(yīng)用程序。
你需要什么
- 約15分鐘
- 最喜歡的文本編輯器或 IDE
- JDK 1.8或更高版本
- Gradle 4+或Maven 3.2+
-
您還可以將代碼直接導(dǎo)入 IDE:
- 彈簧工具套件 (STS)
- IntelliJ IDEA
如何完成本指南
像大多數(shù) Spring入門指南一樣,您可以從頭開始并完成每個(gè)步驟,也可以繞過您已經(jīng)熟悉的基本設(shè)置步驟。無論哪種方式,您最終都會得到工作代碼。
要從頭開始,請繼續(xù)從 Spring Initializr 開始。
要跳過基礎(chǔ)知識,請執(zhí)行以下操作:
- 下載并解壓縮本指南的源存儲庫,或使用Git克隆它:git clone https://github.com/spring-guides/gs-accessing-data-jpa.git
- 光盤進(jìn)入gs-accessing-data-jpa/initial
- 跳轉(zhuǎn)到定義一個(gè)簡單實(shí)體。
完成后,您可以對照中的代碼檢查結(jié)果
gs-accessing-data-jpa/complete。
從 Spring Initializr 開始
您可以使用這個(gè)預(yù)先初始化的項(xiàng)目并單擊 Generate 下載 ZIP 文件。此項(xiàng)目配置為適合本教程中的示例。
手動初始化項(xiàng)目:
- 導(dǎo)航到https://start.spring.io。該服務(wù)提取應(yīng)用程序所需的所有依賴項(xiàng),并為您完成大部分設(shè)置。
- 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
- 單擊Dependencies并選擇Spring Data JPA,然后選擇H2 Database。
- 單擊生成。
- 下載生成的 ZIP 文件,該文件是根據(jù)您的選擇配置的 Web 應(yīng)用程序的存檔。
如果您的 IDE 具有 Spring Initializr 集成,您可以從您的 IDE 完成此過程。
你也可以從 Github 上 fork 項(xiàng)目并在你的 IDE 或其他編輯器中打開它。
定義一個(gè)簡單的實(shí)體
在此示例中,您存儲Customer對象,每個(gè)對象都被注釋為 JPA 實(shí)體。以下清單顯示了 Customer 類(在 中
src/main/java/com/example/accessingdatajpa/Customer.java):
package com.example.accessingdatajpa;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public 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;
}
}復(fù)制
這里有一個(gè)Customer具有三個(gè)屬性的類:id、firstName和lastName。您還有兩個(gè)構(gòu)造函數(shù)。默認(rèn)構(gòu)造函數(shù)的存在只是為了 JPA。您不直接使用它,因此將其指定為protected。另一個(gè)構(gòu)造函數(shù)是您用來創(chuàng)建Customer要保存到數(shù)據(jù)庫的實(shí)例的構(gòu)造函數(shù)。
該類Customer用 注釋@Entity,表示它是一個(gè) JPA 實(shí)體。(由于不@Table存在注解,假設(shè)該實(shí)體映射到名為 的表Customer。)
Customer對象的屬性id帶有注釋,@Id以便 JPA 將其識別為對象的 ID。該id屬性還帶有注釋@GeneratedValue以指示應(yīng)自動生成 ID。
其他兩個(gè)屬性firstName和lastName未注釋。假設(shè)它們被映射到與屬性本身共享相同名稱的列。
方便的toString()方法打印出客戶的屬性。
創(chuàng)建簡單查詢
Spring Data JPA 專注于使用 JPA 將數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫中。它最引人注目的功能是能夠在運(yùn)行時(shí)從存儲庫接口自動創(chuàng)建存儲庫實(shí)現(xiàn)。
要了解它是如何工作的,請創(chuàng)建一個(gè)與Customer實(shí)體一起使用的存儲庫接口,如以下清單(in
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);
}復(fù)制,>
CustomerRepository擴(kuò)展CrudRepository接口。它使用的實(shí)體類型和 IDCustomer以及Long,在通用參數(shù)中指定CrudRepository。通過擴(kuò)展CrudRepository,CustomerRepository繼承了幾種處理Customer持久性的方法,包括保存、刪除和查找Customer實(shí)體的方法。
Spring Data JPA 還允許您通過聲明方法簽名來定義其他查詢方法。例如,CustomerRepository包括findByLastName()方法。
在典型的 Java 應(yīng)用程序中,您可能希望編寫一個(gè)實(shí)現(xiàn)CustomerRepository. 然而,這正是 Spring Data JPA 如此強(qiáng)大的原因:您無需編寫存儲庫接口的實(shí)現(xiàn)。Spring Data JPA 在您運(yùn)行應(yīng)用程序時(shí)創(chuàng)建一個(gè)實(shí)現(xiàn)。
現(xiàn)在你可以連接這個(gè)例子,看看它是什么樣子的!
創(chuàng)建應(yīng)用程序類
Spring Initializr 為應(yīng)用程序創(chuàng)建一個(gè)簡單的類。以下清單顯示了 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;
@SpringBootApplication
public class AccessingDataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class, args);
}
}復(fù)制
@SpringBootApplication是一個(gè)方便的注釋,它添加了以下所有內(nèi)容:
- @Configuration: 將類標(biāo)記為應(yīng)用程序上下文的 bean 定義源。
- @EnableAutoConfiguration:告訴 Spring Boot 根據(jù)類路徑設(shè)置、其他 bean 和各種屬性設(shè)置開始添加 bean。例如,如果spring-webmvc位于類路徑上,則此注釋將應(yīng)用程序標(biāo)記為 Web 應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置DispatcherServlet.
- @ComponentScan: 告訴 Spring 在包中查找其他組件、配置和服務(wù)com/example,讓它找到控制器。
該main()方法使用 Spring Boot 的SpringApplication.run()方法來啟動應(yīng)用程序。您是否注意到?jīng)]有一行 XML?也沒有web.xml文件。這個(gè) Web 應(yīng)用程序是 100% 純 Java,您不必處理任何管道或基礎(chǔ)設(shè)施的配置。
現(xiàn)在您需要修改 Initializr 為您創(chuàng)建的簡單類。要獲得輸出(在本例中為控制臺),您需要設(shè)置一個(gè)記錄器。然后您需要設(shè)置一些數(shù)據(jù)并使用它來生成輸出。以下清單顯示了完成的
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;
@SpringBootApplication
public 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("");
};
}
}復(fù)制
該類
AccessingDataJpaApplication包括一個(gè)通過一些測試的demo()方法。CustomerRepository首先,它CustomerRepository從 Spring 應(yīng)用程序上下文中獲取 。然后它會保存一些Customer對象,演示該save()方法并設(shè)置一些要使用的數(shù)據(jù)。接下來,它調(diào)用從數(shù)據(jù)庫findAll()中獲取所有Customer對象。然后它調(diào)用以通過其 IDfindById()獲取單個(gè)。Customer最后,它調(diào)用findByLastName()查找所有姓氏為“Bauer”的客戶。該demo()方法返回一個(gè)CommandLineRunner在應(yīng)用程序啟動時(shí)自動運(yùn)行代碼的 bean。
默認(rèn)情況下,Spring Boot 啟用 JPA 存儲庫支持并查找所在的包(及其子包)@SpringBootApplication。如果您的配置具有位于不可見包中的 JPA 存儲庫接口定義,則可以通過使用@EnableJpaRepositories及其類型安全basePackageClasses=MyRepository.class參數(shù)指出備用包。
構(gòu)建一個(gè)可執(zhí)行的 JAR
您可以使用 Gradle 或 Maven 從命令行運(yùn)行應(yīng)用程序。您還可以構(gòu)建一個(gè)包含所有必要依賴項(xiàng)、類和資源的單個(gè)可執(zhí)行 JAR 文件并運(yùn)行它。構(gòu)建可執(zhí)行 jar 可以在整個(gè)開發(fā)生命周期、跨不同環(huán)境等中輕松地作為應(yīng)用程序交付、版本化和部署服務(wù)。
如果您使用 Gradle,則可以使用./gradlew bootRun. 或者,您可以使用構(gòu)建 JAR 文件./gradlew build,然后運(yùn)行 ?JAR 文件,如下所示:
java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar
如果您使用 Maven,則可以使用./mvnw spring-boot:run. 或者,您可以使用構(gòu)建 JAR 文件,./mvnw clean package然后運(yùn)行該 JAR 文件,如下所示:
java -jar 目標(biāo)/gs-accessing-data-jpa-0.1.0.jar
此處描述的步驟創(chuàng)建了一個(gè)可運(yùn)行的 JAR。您還可以構(gòu)建經(jīng)典的 WAR 文件。
運(yùn)行應(yīng)用程序時(shí),您應(yīng)該會看到類似于以下內(nèi)容的輸出:
== 使用 findAll() 找到的客戶:
客戶[id=1, firstName='Jack', lastName='Bauer']
客戶[id=2, firstName='Chloe', lastName='O'Brian']
客戶[id=3, firstName='Kim', lastName='Bauer']
客戶[id=4, firstName='David', lastName='Palmer']
客戶[id=5, firstName='Michelle', lastName='Dessler']
== 使用 findById(1L) 找到客戶:
客戶[id=1, firstName='Jack', lastName='Bauer']
== 使用 findByLastName('Bauer') 找到客戶:
客戶[id=1, firstName='Jack', lastName='Bauer']
客戶[id=3, firstName='Kim', lastName='Bauer']
概括
恭喜!您已經(jīng)編寫了一個(gè)簡單的應(yīng)用程序,該應(yīng)用程序使用 Spring Data JPA 將對象保存到數(shù)據(jù)庫并從數(shù)據(jù)庫中獲取它們,而無需編寫具體的存儲庫實(shí)現(xiàn)。
審核編輯:湯梓紅
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3827瀏覽量
64519 -
程序
+關(guān)注
關(guān)注
117文章
3792瀏覽量
81189 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14358
發(fā)布評論請先 登錄
相關(guān)推薦
評論