1. 概述
在 Spring Boot 项目中,我们经常需要为集成测试准备一些初始化数据。常见的做法是通过 SQL 文件将测试数据导入数据库。框架原生支持两种方式:✅ 使用 import.sql
(基于 Hibernate)或 data.sql
(基于 Spring JDBC)。
但实际开发中,单个 SQL 文件容易变得臃肿,难以维护。我们更倾向于将其拆分成多个小文件——比如按业务拆分(用户、订单等),或者跨模块复用初始化脚本。
本文将介绍如何在 Hibernate 和 Spring JDBC 两种机制下,优雅地加载多个 SQL 文件。内容虽短,但全是实战经验,避免你在项目里踩坑 ❌。
2. 使用 Hibernate 加载多个 SQL 文件
Hibernate 提供了一个配置项,允许我们指定多个数据导入文件:spring.jpa.properties.hibernate.hbm2ddl.import_files
。
⚠️ 注意:必须加上
spring.jpa.properties
前缀,这样才能正确传递到EntityManagerFactory
。
假设我们有两个测试数据文件:
import_active_users.sql
:活跃用户数据import_inactive_users.sql
:非活跃用户数据
只需在 src/test/resources/application.properties
中添加:
spring.jpa.properties.hibernate.hbm2ddl.import_files=import_active_users.sql,import_inactive_users.sql
Hibernate 会在启动时自动执行这两个文件中的 SQL 语句。
✅ 注意事项
- 文件必须放在
classpath
下(通常是resources/
目录) - 执行顺序是按配置顺序,不是按文件名排序
- 不支持通配符(比如
*.sql
),必须显式列出每个文件
如果你的项目使用的是 application.yml
,写法如下:
spring:
jpa:
properties:
hibernate:
hbm2ddl:
import_files: import_active_users.sql,import_inactive_users.sql
简单粗暴,适合小项目或固定结构的测试环境。
3. 使用 Spring JDBC 加载多个 SQL 文件
Spring JDBC 提供了更灵活的方案:spring.sql.init.data-locations
。
配置方式类似:
spring.sql.init.data-locations=import_active_users.sql,import_inactive_users.sql
效果和 Hibernate 方案一致,但它的杀手级特性来了:✅ 支持 Ant 风格通配符!
比如你想加载所有用户相关的初始化文件,可以这么写:
spring.sql.init.data-locations=import_*_users.sql
Spring 会自动匹配并加载:
import_active_users.sql
import_inactive_users.sql
import_admin_users.sql
等等,只要符合命名模式。
📁 文件位置说明
默认情况下,Spring 会从以下位置查找这些文件:
classpath:
file:./
你也可以指定目录:
spring.sql.init.data-locations=classpath:db/data/*.sql,classpath:db/shared/*.sql
⚠️ 版本兼容性提醒
spring.sql.init.data-locations
是 Spring Boot 2.5.0 引入的新属性- 如果你还在用老版本(如 2.3.x 或 2.4.x),请使用旧属性:
spring.datasource.data=import_active_users.sql,import_inactive_users.sql
但旧属性不支持通配符,灵活性差很多。
YAML 写法示例
spring:
sql:
init:
data-locations:
- classpath:db/data/import_*.sql
- classpath:db/shared/init_*.sql
这种写法在模块化项目中特别实用,比如多个微服务共享一套基础数据脚本。
4. 总结
方案 | 支持通配符 | 适用场景 |
---|---|---|
import.sql + Hibernate |
❌ | 简单项目,文件少 |
spring.jpa.properties.hibernate.hbm2ddl.import_files |
❌ | 需要精确控制顺序 |
spring.sql.init.data-locations |
✅ | 推荐!文件多、结构复杂 |
spring.datasource.data (旧版) |
❌ | 老项目兼容 |
✅ 最佳实践建议:
- 新项目统一使用
spring.sql.init.data-locations
- 按业务拆分 SQL 文件,命名规范如:
data-users.sql
,data-products.sql
- 测试专用数据放在
src/test/resources
下 - 生产环境注意关闭自动初始化(
spring.sql.init.mode=never
)
完整示例代码已上传至 GitHub:https://github.com/baeldung/spring-boot-persistence(模块:
persistence-modules/spring-boot-persistence
)