跳转至

H2 資料庫

介紹

H2資料庫 (嵌入式資料庫)

用途: 可以再啟動Spring Boot時被生成出來 ,在運行結束後被銷毀 ,用完即丟

常用於單元測試 ,降低程式對實體資料庫的依賴

也就是說 ,任何一台電腦 ,不需要安裝任何軟體 ,都可以運行該單元測試

MySQL vs H2

使用 MySQL 資料庫進行單元測試的運作流程

  1. 在 MySQL 創建table 準備數據
  2. 運行 Spring Boot 單元測試
  3. 啟動 Spring 容器 ,創建 Bean
  4. 執行 @Test 單元測試
  5. 存取 MySQL 資料庫的數據
  6. 單元測試運行完畢 ,銷毀Spring 容器 ,IntelliJ 顯示單元測試結果

使用H2 資料庫進行單元測試的運作流程

  1. 運行 Spring Boot 單元測試
  2. 啟動 Spring 容器 ,創建 Bean
  3. 創建 H2 資料庫
  4. 執行 @Test 單元測試
  5. 存取 H2 資料庫的數據
  6. 單元測試運行完畢 ,銷毀 Spring 容器 ,銷毀 H2 資料庫 ,IntelliJ 顯示單元測試結果

如何開始使用 H2 資料庫

pom.xml

https://mvnrepository.com/artifact/com.h2database/h2

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>test</scope>
</dependency>

application.properties

如果要在單元測試裡面去使用 H2 資料庫的話

那麼我們就會需要去添加一個 單元測試專用的 Spring Boot 設定檔

在裡面去設定 H2 資料庫的連線資訊

這兩個 application.properties 是完全獨立的 ,不會互相干擾

所以如果在 main 這邊的設定檔有新增甚麼設定 ,請務必也要複製貼上到 test 的設定檔

避免單元測試測試失敗

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=sa

// [Spring Data JPA] 
// 加上這行設定 Spring Boot 在執行 SQL 語法時才不會和 Hibernate 預設的設定互相影響
spring.jpa.hibernate.ddl-auto=none

完成設定檔後需要新增 schema.sql 、 data.sql

schema.sql [創建 table]

CREATE TABLE IF NOT EXISTS student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(30),
    score DOUBLE,
    graduate BOOLEAN,
    create_date TIMESTAMP
);

data.sql [插入數據]

INSERT INTO student (name, score, graduate, create_date) VALUES ('Amy', 90.3, true, '2021-09-01 10:20:33');
INSERT INTO student (name, score, graduate, create_date) VALUES ('Rom', 34.6, false, '2021-08-10 17:21:14');
INSERT INTO student (name, score, graduate, create_date) VALUES ('Judy', 100.0, true, '2021-09-05 12:19:48');
INSERT INTO student (name, score, graduate, create_date) VALUES ('Mike', 87.2, true, '2021-09-03 15:01:15');

schema.sqldata.sql 這兩個檔案是 Spring Boot 專門為 H2 資料庫所提供的一項功能