Spring Boot 与 H2 数据库

更新于 2025-12-30

baeldung 2019-04-18

Spring Boot 与 H2 数据库

1. 概述

在本教程中,我们将探索如何在 Spring Boot 中使用 H2 数据库。与其他数据库一样,Spring Boot 生态系统对 H2 提供了完整的内置支持。

2. 依赖项

首先,我们需要添加 h2spring-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

H2 数据库还支持其他运行模式。

4. 数据库操作

在 Spring Boot 中对 H2 执行 CRUD 操作与其他 SQL 数据库完全相同。关于此内容,我们的《Spring 持久化系列》教程已有详细介绍。

4.1. DataSource 初始化

我们可以使用基本的 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');

该脚本会向 countries 表中插入一些示例数据。

Spring Boot 会自动加载并执行该文件中的 SQL 语句(针对嵌入式内存数据库,如我们配置的 H2 实例)。这是为测试或初始化目的“播种”数据库的一种便捷方式。

可通过设置 spring.sql.init.mode=never 来禁用此默认行为。此外,也支持配置多个 SQL 文件来加载初始数据。

4.2. Hibernate 与 data.sql

默认情况下,data.sql 脚本会在 Hibernate 初始化之前执行。这种设计使其与其他数据库迁移工具(如 Flyway 和 Liquibase)的行为保持一致。

然而,由于 Hibernate 每次都会重新生成表结构,若希望在 Hibernate 创建完表后再插入数据,需额外设置以下属性:

spring.jpa.defer-datasource-initialization=true

该配置会改变 Spring Boot 的默认行为,确保在 Hibernate 生成 schema 之后再执行 data.sql 中的数据填充。

此外,还可以使用 schema.sql 脚本来在 Hibernate 生成的 schema 基础上进一步调整结构,然后再由 data.sql 填充数据。但不建议混合使用多种 schema 生成机制

5. 访问 H2 控制台

H2 数据库内置了一个图形化 Web 控制台,可用于浏览数据库内容和执行 SQL 查询。默认情况下,Spring Boot 不会启用该控制台。

要启用它,需在 application.properties 中添加:

spring.h2.console.enabled=true

若使用 YAML 配置,则在 application.yaml 中添加:

spring:
  h2:
    console:
      enabled: true

启动应用后,访问 http://localhost:8080/h2-console 即可打开登录页面。

在登录页面中,输入我们在配置文件中设置的数据库连接信息(如 URL、用户名、密码)。

成功连接后,将看到一个功能完整的网页界面:左侧列出所有表,右侧提供 SQL 查询输入框。

该控制台具备 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
        web-allow-others: false

说明:

  • path:指定控制台访问路径(相对于应用地址和端口)。例如,若应用运行在 http://localhost:9001,则控制台地址为 http://localhost:9001/h2-console
  • settings.trace=false:关闭跟踪输出。
  • settings.web-allow-others=false:禁止远程访问,提升安全性。

6. H2 数据库 URL 选项

H2 的 JDBC URL 支持多种参数,用于进一步定制数据库行为:

  • DB_CLOSE_DELAY=-1:确保数据库在 JVM 运行期间始终保持打开状态,即使最后一个连接已关闭(默认会在最后一个连接关闭时自动关闭数据库)。注意:为避免内存泄漏,应在适当时候通过 SHUTDOWN 命令显式关闭数据库。
  • DB_CLOSE_ON_EXIT=FALSE:默认情况下,H2 会在 JVM 关闭时关闭数据库。设为 FALSE 可使数据库在 JVM 退出后仍保持打开状态(适用于需要在关机后执行日志记录等操作的场景)。
  • AUTO_RECONNECT=TRUE:启用自动重连功能(默认为 FALSE),在网络不稳定导致连接中断时非常有用。
  • MODE=PostgreSQL:使 H2 模拟 PostgreSQL 的行为。H2 还支持 MySQL、Oracle 等多种数据库的兼容模式。

示例 URL(包含多个选项):

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;MODE=PostgreSQL;

该配置使 H2 数据库:

  • 在 JVM 运行期间保持开启;
  • JVM 退出后仍不关闭;
  • 支持自动重连;
  • 以 PostgreSQL 兼容模式运行。

7. 结论

H2 数据库与 Spring Boot 完全兼容。本文介绍了如何配置 H2,以及如何使用其内置控制台来管理和查询运行中的数据库。