Spring Boot 整合使用 H2 内存数据库
1、概览
本文将带你了解如何在 Spring Boot 中使用 H2 内存数据库。与其他数据库一样,Spring Boot 生态系统对 H2 提供了开箱即用的支持。
2、依赖
添加 h2 和 spring-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 初始化之前执行。这使基于脚本的初始化与其他数据库迁移工具(如 Flyway 和 Liquibase)保持一致。由于我们每次都要重新创建由 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
中相配置的凭证进行登录:
连接到数据库后,会看到一个综合网页,页面左侧列出了所有表,还有一个用于运行 SQL 查询的文本框:
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