1. 概述

在 Spring Boot 项目中,我们经常需要为集成测试准备一些初始化数据。常见的做法是通过 SQL 文件将测试数据导入数据库。框架原生支持两种方式:✅ 使用 import.sql(基于 Hibernate)或 data.sql(基于 Spring JDBC)。

但实际开发中,单个 SQL 文件容易变得臃肿,难以维护。我们更倾向于将其拆分成多个小文件——比如按业务拆分(用户、订单等),或者跨模块复用初始化脚本。

本文将介绍如何在 HibernateSpring 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


原始标题:Spring Boot with Multiple SQL Import Files | Baeldung