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>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

3、Datasource 配置

默认情况下,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 配置如下:

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

内存数据库会在应用重启后会丢失数据,可以通过使用基于文件的存储来改变这种行为。

更新 spring.datasource.url 属性:

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

相应的 YAML 配置如下:

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

H2 数据库还可以在 其他模式 下运行。

4、数据库操作

在 Spring Boot 中使用 H2 执行 CRUD 操作与使用其他 SQL 数据库相同。

4.1、初始化数据库

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');

如上,该脚本使用一些示例数据填充 schema 中的 countries 表。

Spring Boot 会自动获取该文件,并在嵌入式内存数据库(如我们配置的 H2 实例)中运行。这是测试或初始化数据库的好方法。

可以将 spring.sql.init.mode 属性设置为 never,从而禁用这一默认行为。此外,还可以配置多个 SQL 文件来加载初始数据。

4.2、Hibernate 和 data.sql

默认情况下,data.sql 脚本在 Hibernate 初始化之前执行。这使基于脚本的初始化与其他数据库迁移工具(如 FlywayLiquibase)保持一致。由于我们每次都要重新创建由 Hibernate 生成的 Schema,因此需要设置一个额外的属性:

spring.jpa.defer-datasource-initialization=true

这修改了 Spring Boot 的默认行为,并在 Hibernate 生成 Schema 后填充数据。此外,还可以使用 schema.sql 脚本在使用 data.sql 填充数据之前对 Hibernate 生成的 Schema 进行扩展。然而,不建议混合使用不同的 Schema 生成机制。

5、访问 H2 控制台

H2 数据库有一个嵌入式 Web 控制台,用于浏览数据库内容和运行 SQL 查询。默认情况下,Spring 不会启用 H2 控制台。

要启用它,需要在 application.properties 中添加以下属性:

spring.h2.console.enabled=true

对应的 YAML 配置如下:

spring:
  h2:
    console.enabled: true

配置完毕后,启动应用。通过浏览器访问控制台登录页面:http://localhost:8080/h2-console。使用 application.properties 中相配置的凭证进行登录:

h2 console - login|1024x496

连接到数据库后,会看到一个综合网页,页面左侧列出了所有表,还有一个用于运行 SQL 查询的文本框:

h2 console - SQL Statement|3294x1714

Web 控制台具有自动补全功能,可提示 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
      settings.web-allow-others: false

在上面的配置中,将控制台路径设置为 /h2-console,这是相对于运行应用的地址和端口而言的。因此,如果应用在 http://localhost:9001 上运行,那么控制台的访问地址是:http://localhost:9001/h2-console

此外,可以把 spring.h2.console.settings.trace 设置为 false,以防止 Trace 输出,还可以将 spring.h2.console.settings.web-allow-others 设置为 false,禁止远程访问。

关于更多 H2 数据库的配置项,你可以参阅 中文文档

6、总结

本文介绍了如何在 Spring Boot 中整合、使用 H2 数据库,以及如何配置 H2 的 Web 控制台。


Ref:https://www.baeldung.com/spring-boot-h2-database