自動為 H2 內存數據庫創建模式
一、簡介
H2 數據庫引擎是一種基於 Java 構建的流行開源數據庫。在這個簡短的教程中,我們將學習如何為 H2 內存數據庫自動創建模式。
2. 什麼是H2?
H2 數據庫引擎是一個基於 Java 的數據庫,同時兼容 SQL 和 JDBC 。它有許多區別於其他關係數據庫的特性:
- 持久性:它可以作為純內存數據庫或使用文件系統運行。
- 模式:作為獨立服務器運行或嵌入到另一個應用程序中。
這兩個特性使 H2 成為開發和測試目的的絕佳選擇。然而,由於其短暫的性質,它也可能帶來一些挑戰。
連接到 H2 內存數據庫時,架構可能不存在。這是因為內存數據庫本質上是瞬態的,只有在它們運行的應用程序也在運行時才會存在。一旦該應用程序終止,內存數據庫的全部內容就會丟失。
接下來,我們將看到幾種不同的方法來在連接到 H2 內存數據庫時對其進行初始化。
3.在H2中自動創建模式
有幾種方法可以自動為 H2 內存數據庫創建模式。與大多數事情一樣,每一種都有利弊,選擇使用哪一種取決於多種因素。
3.1.純Java
下面的示例顯示瞭如何使用純 Java 代碼和 JDBC 初始化內存中的 H2 數據庫。對於不使用 Spring 或其他提供數據庫連接的框架的應用程序來說,這是一個不錯的選擇:
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:baeldung;INIT=CREATE SCHEMA IF NOT EXISTS baeldung",
"admin",
"password");
在上面的示例中,我們使用連接 URL 來指定要創建的模式。我們還可以通過額外的命令來進一步初始化數據庫:
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:baeldung;INIT=CREATE SCHEMA IF NOT EXISTS baeldung\\;SET SCHEMA baeldung;CREATE TABLE users (name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL);",
"admin",
"password");
由於所有這些命令都會使 URL 難以閱讀,因此 H2 還支持通過引用 SQL 文件來初始化內存數據庫。首先,我們使用初始化語句創建文件:
CREATE SCHEMA IF NOT EXISTS baeldung;
SET SCHEMA baeldung;
CREATE TABLE users (name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL);
然後我們使用稍微修改過的連接 URL 來引用該文件:
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:baeldung;INIT=RUNSCRIPT FROM 'h2init.sql';",
"admin",
"password");
3.2.彈簧靴
在使用 Spring Boot 應用程序時,我們還可以利用熟悉的 Spring 數據屬性來初始化 H2 內存數據庫。
首先,我們可以在 URL 本身中提供所有初始化語句,就像上面一樣。我們首先為 H2 數據源定義 Spring 屬性:
spring.datasource.url=jdbc:h2:mem:baeldung;INIT=CREATE SCHEMA IF NOT EXISTS baeldung\\;<code class="language-java">SET SCHEMA baeldung;
然後我們可以像在任何普通應用程序中一樣使用默認的Datasource
bean:
public void initDatabaseUsingSpring(@Autowired DataSource ds) {
try (Connection conn = ds.getConnection()) {
conn.createStatement().execute("create table users (name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL);");
conn.createStatement().execute("insert into users (name, email) values ('Mike', '[email protected]')");
}
catch (Exception e) {
e.printStackTrace();
}
}
就像普通的 Java 代碼一樣,我們也可以在包含所有初始化語句的連接 URL 中引用一個 SQL 文件。我們所要做的就是更新我們的屬性:
spring.datasource.url=jdbc:h2:mem:baeldung;INIT=RUNSCRIPT FROM 'src/main/resources/h2init.sql';
值得注意的是,H2 不通過 Spring Boot 加載資源。因此,我們必須在應用程序運行位置的完整上下文中引用文件路徑。
現在我們可以像以前一樣使用Datasource
,但不必先初始化模式:
private void initDatabaseUsingSpring(@Autowired DataSource ds) {
try (Connection conn = ds.getConnection()) {
conn.createStatement().execute("insert into users (name, email) values ('Mike', '[email protected]')");
}
catch (Exception e) {
e.printStackTrace();
}
}
最後,在使用 Spring Boot 時,我們還可以在不依賴 H2 特性的情況下利用 SQL init 模式。我們只需將初始化文件重命名為data.sql
並稍微更改我們的屬性:
spring.datasource.url=jdbc:h2:mem:baeldung
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=admin
spring.datasource.password=password
spring.sql.init.mode=embedded
我們應該注意,我們的屬性沒有提及架構或初始化文件。
3.3.春天的XML
此外,如果我們使用純 Spring XML 來配置Datasource
,我們也可以在其中包含初始化語句。
讓我們看看如何創建模式:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS baeldung\\;SET SCHEMA baeldung;"/>
<property name="username" value="admin"/>
<property name="password" value="password"/>
</bean>
正如我們之前看到的,在 URL 中包含多個初始化語句會使讀取屬性變得困難。因此,將它們放入單個 SQL 文件並在 URL 中引用它是個好主意:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb;INIT=RUNSCRIPT FROM 'src/main/resources/h2init.sql';"/>
<property name="username" value="admin"/>
<property name="password" value="password"/>
</bean>
4。結論
H2 內存數據庫是 Java 開發人員比較流行的內存和嵌入式數據庫選項之一。由於速度快且佔用空間小,因此非常適合軟件測試和自動化管道等用例。
在本文中,我們看到了幾種方法來確保我們的 H2 內存數據庫在我們的應用程序啟動時自動初始化並準備好用於查詢。無論我們使用普通的 JDBC 還是 Spring 框架,只需要幾行配置就可以確保我們的內存數據庫完全初始化並準備好在啟動時使用。
與往常一樣,上面的代碼示例可以在 GitHub 上找到。