1. 概述

H2 是一个轻量级的 Java 嵌入式数据库,因其启动快、配置简单,常用于开发和测试环境。Spring Boot 对 H2 提供了开箱即用的支持,无论是内存模式还是文件模式,都能轻松集成。

本文将带你一步步掌握如何在 Spring Boot 项目中集成 H2 数据库,包括依赖配置、初始化脚本、控制台访问等内容。


2. 添加依赖

要使用 H2,首先需要在 pom.xml 中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

spring-boot-starter-data-jpa 提供了 JPA 支持,是与数据库交互的基础
h2 依赖用于引入 H2 数据库驱动,runtime 范围表示仅在运行时使用


3. 数据库配置

默认情况下,Spring Boot 会使用内存数据库,用户名为 sa,密码为空。我们可以通过 application.propertiesapplication.yaml 自定义配置。

使用 properties 配置:

spring.datasource.url=jdbc:h2:mem:mydb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

使用 YAML 配置:

spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect

⚠️ spring.jpa.database-platform 必须设置为 H2Dialect,否则 Hibernate 可能无法识别 H2 的方言


4. 数据库持久化配置

默认的内存数据库在应用重启后数据会丢失。如果你希望数据持久化保存,可以改为使用文件存储:

spring.datasource.url=jdbc:h2:file:/data/demo

或 YAML:

spring:
  datasource:
    url: jdbc:h2:file:/data/demo

这样数据库内容会被写入磁盘,重启后数据不会丢失。


5. 数据库操作

5.1 初始化数据脚本

Spring Boot 支持通过 data.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');

✅ Spring Boot 会在应用启动时自动执行该脚本
✅ 适用于测试数据或基础数据初始化

若要禁用此行为,设置:

spring.sql.init.mode=never

5.2 Hibernate 与 data.sql 的执行顺序

默认情况下,data.sql 会在 Hibernate 初始化之前执行。如果你希望它在 Hibernate 生成 schema 之后执行,需添加:

spring.jpa.defer-datasource-initialization=true

⚠️ 如果你同时使用了 schema.sql 和 Hibernate 自动生成 schema,可能会导致冲突,不推荐混合使用


6. 访问 H2 控制台

H2 提供了一个 Web 控制台,可以用来查看表结构、执行 SQL 语句等。默认是关闭的,需要手动开启。

启用控制台:

spring.h2.console.enabled=true

或 YAML:

spring:
  h2:
    console.enabled: true

启动应用后访问:http://localhost:8080/h2-console

输入你在配置中设置的用户名和密码即可登录。

h2 console - login

登录后可以查看表结构并执行 SQL 查询:

h2 console - SQL Statement

控制台高级配置:

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

path 可以自定义访问路径
web-allow-others 设置为 false 可防止远程访问,增强安全性


7. H2 数据库 URL 配置选项

H2 提供了多种 URL 参数用于控制数据库行为:

参数 说明
DB_CLOSE_DELAY=-1 JVM 关闭前保持数据库连接
DB_CLOSE_ON_EXIT=FALSE 禁止 JVM 关闭时自动关闭数据库
AUTO_RECONNECT=TRUE 自动重连,适用于网络不稳定场景
MODE=PostgreSQL 模拟 PostgreSQL 行为(也支持 MySQL、Oracle 等)

示例配置:

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

✅ 适用于需要模拟其他数据库行为的场景,比如测试兼容性


8. 总结

H2 是一个轻量、快速、支持多种模式的数据库,非常适合在 Spring Boot 项目中用于开发和测试。结合其 Web 控制台和脚本初始化功能,可以极大提升开发效率。

完整示例代码可在 GitHub 上找到。


原始标题:Spring Boot With H2 Database | Baeldung

» 下一篇: Java 匿名类详解