使用 Spring Boot 自動建立資料庫架構
一、簡介
Spring Boot 與 JPA 無縫協作,讓我們可以輕鬆地在應用程式中實現資料存取層。它的強大功能之一是能夠基於 Java 實體類別自動建立和管理資料庫模式。透過一些配置,我們可以指示 Spring Boot 讀取我們的實體類別並自動建立或更新模式。
在本文中,我們將簡要討論如何利用 Spring Boot 和 JPA 的強大功能來自動建立資料庫架構,而無需編寫 SQL 語句。我們還將看到配置過程中需要避免的一些常見陷阱。
2. 配置自動架構創建
在本節中,我們將了解配置 Spring Boot 以自動建立資料庫的步驟。
2.1.新增所需的依賴項
在配置我們的專案以建立模式之前,我們應該確保我們的 Spring Boot 專案包含正確的依賴項。
首先,我們需要Spring Data JPA來進行資料庫互動。它在 JPA 上提供了一個抽象層:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
然後,我們需要將特定於資料庫的依賴項新增到我們的專案中。
對於H2資料庫,我們需要新增以下依賴:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
對於MySQL ,依賴關係如下:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
對於PostgreSQL ,我們應該加入以下依賴項:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
2.2.設定application.properties
Spring Boot 使用application.properties
檔案來定義設定。這是我們包含資料庫連接詳細資訊和其他配置的地方。
讓我們看看 H2 資料庫的配置:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
# JPA Configuration
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
對於我們的 MySQL,設定是:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
對於我們的 PostgreSQL,讓我們來設定:
spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
2.3.了解spring.jpa.hibernate.ddl-auto
選項
自動模式建立的關鍵配置選項是spring.jpa.hibernate.ddl-auto 。此設定控制應用程式啟動時如何管理資料庫架構。接下來,讓我們了解可用的選項。
none選項意味著不發生模式產生或驗證。當資料庫模式已經完美設定並且我們不希望 Hibernate 對其進行任何更改時,這是理想的選擇。
驗證選項檢查現有資料庫模式是否與實體類別相符。不會進行任何更改,但如果存在差異,例如缺少列,則會引發錯誤。這對於確保無需修改的對齊非常有用。
更新選項修改資料庫架構以符合實體類別。它會新增新的列或表,但不會刪除或變更現有結構。當我們需要在不冒資料遺失風險的情況下改進模式時,這是一個安全的選擇。
create選項會刪除整個資料庫架構,並在每次應用程式啟動時重新建立它。當我們願意在每次運行時丟失和重建架構時,請使用此選項。
我們使用create-drop選項在應用程式啟動時建立架構,並在應用程式停止時刪除它。這對於不需要運行之間持久性的臨時環境或測試非常方便。
最後,**刪除選項僅刪除架構而不重新建立它。當我們有意要清理整個資料庫時,這非常有用。
在生產環境中,開發人員經常使用更新選項來確保架構不斷發展以匹配應用程序,而不會冒刪除現有資料的風險。
2.4.建立實體類別
配置到位後,我們就可以建立實體類別。這些類別代表我們資料庫中的表並直接對應到它們。
讓我們來看一個例子:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String firstName;
private String lastName;
//Setters and getters
}
@Entity註解將Person類別標記為 JPA 實體。這意味著它將被映射到相應的資料庫表,除非另有說明,通常命名為「Person」。
@Id註解指定id為主鍵列。而*@GenerateValue(strategy = GenerationType.IDENTITY)*表示資料庫將為新行自動產生主鍵(例如,自動遞增值)。
此外, id 、 firstName和lastName表示資料庫表中的欄位。
3.測試我們的改變
讓我們測試使用 Spring Data JPA 儲存和擷取 Person 實體的功能:
void whenSavingPerson_thenPersonIsPersistedCorrectly() {
long countBefore = personRepository.count();
assertEquals(0, countBefore, "No persons should be present before the test");
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
Person savedPerson = personRepository.save(person);
assertNotNull(savedPerson, "Saved person should not be null");
assertTrue(savedPerson.getId() > 0, "ID should be greater than 0"); // Check if ID was generated
assertEquals("John", savedPerson.getFirstName(), "First name should be 'John'");
assertEquals("Doe", savedPerson.getLastName(), "Last name should be 'Doe'");
}
此測試可確保Person
實體正確保留在資料庫中。它首先檢查測試前是否不存在Person
記錄,然後建立一個具有特定值的新Person
物件。接下來,在使用儲存庫保存實體後,測試隨後驗證已儲存的實體不為空。它還測試產生的 ID 是否大於 0,並保留正確的名字和姓氏。
4. 常見問題故障排除
在 Spring Boot 中設定自動模式建立通常很簡單,但有時可能會出現問題,模式可能不會如預期般產生。
一個常見的問題是,由於命名約定或資料庫方言問題,系統可能無法建立表格。為了避免這種情況,我們需要確保在application.properties檔案中正確設定spring.jpa.database-platform屬性。
另一個有用的技巧是透過設定spring.jpa.show-sql=true屬性來啟用 Hibernate 日誌記錄。這將列印 Hibernate 產生的 SQL 語句,這有助於偵錯架構建立問題。
確保我們的實體類別位於與*@EnableAutoConfiguration*註解的類別(通常是主應用程式類別)相關的相同套件或子套件中也很重要。如果 Spring Boot 無法找到我們的實體,它不會在資料庫中建立相應的表。
此外,驗證application.properties檔案是否位於正確的目錄中,通常位於src/main/resources下。這確保了 Spring Boot 可以正確載入我們的配置。
我們還需要小心資料庫連接的錯誤配置。如果連線設定不正確,Spring Boot 可能會預設使用 H2 或 HSQLDB 等記憶體資料庫。檢查日誌中是否有意外的資料庫連線有助於防止此問題。
最後,當我們在application.properties
(或application.yml
)檔案中使用預設的spring.datasource.*
屬性時,Spring Boot 自動配置將自動偵測這些屬性並配置資料來源,而無需任何額外的設定類別或Bean 。
但是,當我們使用像h2.datasource.*
這樣的自訂前綴時,Spring Boot 的預設自動配置不會自動選擇這些屬性,因為它專門尋找spring.datasource.*
前綴。
在這種情況下,我們需要手動配置資料來源bean並告訴Spring Boot使用@ConfigurationProperties:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "h2.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
5. 結論
在本教程中,我們了解如何使用 Spring Boot 自動建立和更新資料庫模式。這是一個簡化資料庫管理的強大功能。透過最少的配置,我們可以使資料庫模式與 Java 實體保持同步,確保我們的應用程式保持一致並且不會出現與模式相關的問題。
而且,與往常一樣,範例的原始程式碼可以在 GitHub 上找到。