從 H2 資料庫中的檔案執行查詢
1. 概述
在本教程中,我們將探討如何從 H2 資料庫檔案中執行腳本。 H2 是一個開源 Java 資料庫,可以嵌入到 Java 應用程式中或作為單獨的伺服器運行。它通常用作記憶體資料庫以進行測試。
有時,我們可能需要在執行應用程式之前或同時執行腳本檔案來建立表格、插入資料或更新資料庫中的資料。
2. 設定
對於我們的程式碼範例,我們將建立一個小型 Spring Boot 應用程式。我們將在應用程式中包含嵌入式 H2 資料庫。然後我們將嘗試不同的方法來執行修改資料庫的腳本檔案。
2.1.依賴關係
讓我們先將[spring-boot-starter-data-jpa](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa)
依賴項加入pom.xml
檔中:
`
`
此依賴項為具有 JPA 支援的 Spring Boot 應用程式建立了基本設定。
為了在我們的專案中使用H2,我們需要加入H2資料庫依賴:
`
`
2.2.特性
接下來,我們需要在application.properties
檔案中設定與 H2 資料庫的連線:
`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
spring.jpa.hibernate.ddl-auto=none`
此配置設定 H2 資料庫的 URL、驅動程式類別、使用者名稱和密碼。它還設置資料庫平台並禁用自動模式生成。停用自動模式產生很重要,因為我們希望稍後執行腳本檔案來建立模式。
3. 在 Spring Boot 應用程式中執行腳本
現在我們已經設定了項目,讓我們探索在 Spring Boot 應用程式中執行腳本檔案的不同方法。有時,應用程式啟動時可能需要向資料庫新增資料。例如,如果我們想使用預先定義的資料執行測試,我們可以使用腳本檔案將資料插入資料庫。
3.1.使用預設文件
預設情況下,Spring Boot 在src/main/resources
目錄中尋找名為schema.sql
檔案來建立模式。它還在同一目錄中尋找名為data.sql
的文件,並在應用程式啟動時執行其命令。
因此,讓我們建立一個schema.sql
檔。該檔案包含在 H2 資料庫中建立表格的 SQL 腳本:
`CREATE TABLE IF NOT EXISTS employee (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);`
同樣,讓我們建立一個data.sql
文件,其中包含用於將記錄插入到employee
表中並更新一條記錄的 SQL 腳本:
`INSERT INTO employee (name) VALUES ('John');
INSERT INTO employee (name) VALUES ('Jane');
UPDATE EMPLOYEE SET NAME = 'Jane Doe' WHERE ID = 2;`
當我們執行應用程式時,Spring Boot 會自動執行這些腳本來建立表格並插入/更新資料。
3.2.來自不同目錄的文件
我們可以透過在application.properties
檔案中設定spring.sql.init.schema-locations
和spring.sql.init.data-locations
屬性來變更預設檔案位置。當我們想要在不同的環境中使用不同的檔案或想要將腳本保存在不同的目錄中時,這非常有用。
讓我們將schema.sql
和data.sql
檔案移到不同的目錄 - src/main/resources/db
並更新屬性:
`spring.sql.init.data-locations=classpath:db/data.sql
spring.sql.init.schema-locations=classpath:db/schema.sql`
現在,當我們執行應用程式時,Spring Boot 會在db
目錄中尋找schema.sql
和data.sql
檔。
3.3.使用程式碼
我們也可以使用程式碼運行腳本檔案。當我們想要有條件地運行腳本文件或想要基於某些邏輯運行腳本文件時,這非常有用。對於此範例,我們在src/main/resources
目錄中建立一個名為script.sql
的腳本檔案。
該檔案包含用於更新和讀取employee
表資料的 SQL 腳本:
`UPDATE employee SET NAME = 'John Doe' WHERE ID = 1;
SELECT * FROM employee;`
H2驅動提供了RunScript.execute()
方法來幫助我們執行腳本。讓我們使用此方法在 Spring Boot 應用程式中執行腳本檔案。
我們將在主類別中建立一個@PostConstruct
方法來運行腳本檔案:
`@PostConstruct
public void init() throws SQLException, IOException {
Connection connection = DriverManager.getConnection(url, user, password);
ResultSet rs = RunScript.execute(connection, new FileReader(new ClassPathResource("db/script.sql").getFile()));
log.info("Reading Data from the employee table");
while (rs.next()) {
log.info("ID: {}, Name: {}", rs.getInt("id"), rs.getString("name"));
}
}`
@PostConstruct
註解告訴應用程式在初始化應用程式上下文後運行init()
方法。在此方法中,我們建立與 H2 資料庫的連接,並使用RunScript.execute()
方法執行script.sql
檔案。
當我們執行應用程式時,Spring Boot 會執行腳本來更新和讀取employee
表中的資料。我們在控制台中看到腳本的輸出:
`Data from the employee table:
John Doe
Jane Doe`
4. 透過命令列運行腳本
另一個選擇是透過命令列運行腳本檔案。當我們想要在即時資料庫上運行腳本時,這非常有用。我們可以使用H2資料庫提供的RunScript
工具來執行腳本檔案。該工具可在 H2 jar 檔案中找到。
要使用這個工具,我們需要執行以下命令:
java -cp /path/to/h2/jar/h2-version.jar org.h2.tools.RunScript -url jdbc:h2:db/server/url -user sa -password password -script script.sql -showResults
在這裡,我們在類別路徑(-cp
) 選項中提供 H2 jar 檔案的路徑、資料庫 URL、使用者和密碼。最後,我們提供要運行的script.sql
檔。如果我們想要顯示執行腳本的結果,則需要-showResults
選項。
需要注意的是,記憶體資料庫不能在不同進程之間共用。如果我們在這裡使用記憶體資料庫 URL,它將為RunScript
工具建立一個新資料庫,而不是使用 Spring Boot 應用程式建立的資料庫。
5. 結論
在本文中,我們探討如何執行 H2 資料庫的腳本檔案。我們學習如何使用預設資源檔案、自訂位置的檔案以及透過程式碼在 Spring Boot 應用程式中執行腳本檔案。我們也學習如何使用H2資料庫提供的RunScript
工具透過命令列運行腳本檔案。
與往常一樣,程式碼範例可在 GitHub 上取得。