1. 概述
在本教程中,我們將探索如何使用 H2 與 Spring Boot 結合使用。 就像其他數據庫一樣,H2 在 Spring Boot 生態系統中得到了完全的內在支持。
2. 依賴項
讓我們從 h2 和 spring-boot-starter-data-jpa 依賴項開始:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>runtime</scope>
</dependency>3. 數據庫配置
默認情況下,Spring Boot 會配置應用程序連接到內存存儲,用户名是 sa,密碼為空。
但是,可以通過在 application.properties 文件中添加以下屬性來更改這些參數:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect當然,以下是翻譯後的內容:
或者,我們還可以使用 YAML 來配置應用程序的數據庫,通過將相應的屬性添加到 application.yaml文件中:
spring:
datasource:
url: jdbc:h2:mem:mydb
username: sa
password: password
driverClassName: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect根據設計,內存數據庫是可變性的,因此在應用程序重啓後會導致數據丟失。
我們可以通過使用基於文件的存儲來改變這種行為。為此,我們需要更新 spring.datasource.url 屬性:
spring.datasource.url=jdbc:h2:file:/data/demo同樣,在 application.yaml 中,我們可以添加相同的屬性用於基於文件的存儲:
spring:
datasource:
url: jdbc:h2:file:/data/demo數據庫還可以在其他模式下運行。
4. 數據庫操作
在 Spring Boot 中使用 H2 執行 CRUD 操作與使用其他 SQL 數據庫的過程相同。我們的 Spring Persistence 系列教程很好地涵蓋了這一主題。4.1. 數據源初始化
我們可以使用基本的 SQL 腳本來初始化數據庫。為了演示這一點,讓我們在 src/main/resources 目錄下添加一個 data.sql 文件:
INSERT INTO countries (id, name) VALUES (1, 'USA');
INSERT INTO countries (id, name) VALUES (2, 'France');
INSERT INTO countries (id, name) VALUES (3, 'Brazil');
INSERT INTO countries (id, name) VALUES (4, 'Italy');
INSERT INTO countries (id, name) VALUES (5, 'Canada');在這裏,腳本將一些樣例文檔填充到我們的 schema 中的 countries 表中。
Spring Boot 將自動拾取此文件並將其運行到嵌入式內存數據庫上,例如我們配置的 H2 實例。 這是一種 用於為測試或初始化目的填充數據庫的好方法。
我們可以通過將 spring.sql.init.mode 屬性設置為 never 來禁用此默認行為。 此外,還可以配置多個 SQL 文件以加載初始數據。
我們的關於加載初始數據的文章會更詳細地介紹這個主題。
4.2. Hibernate 和 <em data.sql
默認情況下,<strong data.sql 腳本會在 Hibernate 初始化之前執行。 這一設計與 Flyway 和 Liquibase 等其他數據庫遷移工具保持一致。 鑑於我們每次都重新創建 Hibernate 生成的模式,因此需要設置一個額外的屬性:
spring.jpa.defer-datasource-initialization=true這段代碼生成和數據填充的默認行為會被修改,並且在生成模式後會填充數據,這是由Hibernate提供的。 此外,我們還可以使用schema.sql腳本來在填充數據之前,基於Hibernate生成的模式進行擴展。 但是,混合使用不同的模式生成機制並不推薦。
5. 訪問 H2 控制枱
H2 數據庫內置了一個 GUI 控制枱,用於瀏覽數據庫內容和運行 SQL 查詢。默認情況下,H2 控制枱在 Spring 中未啓用。
要啓用它,我們需要將以下屬性添加到 application.properties:
spring.h2.console.enabled=true如果使用 YAML 配置,則需要將該屬性添加到 application.yaml:
spring:
h2:
console
enabled: true然後,啓動應用程序後,我們可以導航到 http://localhost:8080/h2-console,這將向我們展示一個登錄頁面。
在登錄頁面上,我們將使用與在 application.properties 中使用的相同的憑據:
一旦連接成功,我們將會看到一個包含所有表單左側頁面的全面網頁,以及一個用於運行 SQL 查詢的文本框:
H2 控制枱具有自動完成功能,可以提示 SQL 關鍵字。由於控制枱輕量級,因此它非常適合用於直觀地檢查數據庫或直接執行原始 SQL。
此外,我們還可以通過在項目的 application.properties 中指定以下屬性來進一步配置控制枱,並使用我們想要的值:
spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=false同樣,在使用 YAML 配置時,我們可以將上述屬性添加為:
spring:
h2:
console:
path: /h2-console
settings.trace: false
settings.web-allow-others: false在上述示例中,我們設置了控制枱路徑為 /h2-console,該路徑相對於我們正在運行應用程序的地址和端口。因此,如果我們的應用程序正在運行在 http://localhost:9001,則控制枱將可用在 http://localhost:9001/h2-console。
此外,我們將 spring.h2.console.settings.trace 設置為 false 以防止輸出跟蹤信息,並且還可以通過將 spring.h2.console.settings.web-allow-others 設置為 false 來禁用遠程訪問。
6. H2 數據庫 URL 選項
讓我們探索一些 URL 選項以進一步自定義 H2 數據庫:
- DB_CLOSE_DELAY = -1:此選項確保數據庫在 Java 虛擬機 (JVM) 運行時保持打開狀態。它會阻止在最後一個連接關閉時自動關閉數據庫。默認情況下,數據庫在最後一個連接終止時關閉。默認值為零。但是,為了避免潛在的內存泄漏,必須使用 shutdown 命令關閉數據庫。
- DB_CLOSE_ON_EXIT = FALSE:默認情況下,H2 在 JVM 關閉時關閉數據庫。將此選項設置為 FALSE 會在 JVM 關閉後仍然保持數據庫打開狀態。這在數據庫需要保持打開狀態以進行後關閉處理(例如,記錄關閉活動)的情況下可能很有用。
- AUTO_RECONNECT=TRUE:此選項啓用數據庫在連接丟失時自動重新連接。默認值為 FALSE。啓用此選項在網絡問題導致斷開連接的環境中可能很有用。
- MODE=PostgreSQL:此選項將 H2 數據庫設置為模擬 PostgreSQL 數據庫的行為。它為不同的數據庫系統(例如 MySQL、ORACLE 等)提供了兼容性模式。
這是一個包含一些選項的示例 H2 數據庫 URL:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;MODE=PostgreSQL;
此 URL 配置 H2 數據庫在 JVM 運行期間保持打開狀態,在 JVM 停止運行後繼續保持打開,在連接中斷時自動重新連接,並以 PostgreSQL 兼容模式運行。
7. 結論
H2數據庫與Spring Boot完全兼容。我們已經瞭解瞭如何配置它,以及如何使用H2控制枱來管理我們的運行數據庫。