SpringBoot启动自动执行sql脚本

文章介绍了SpringBoot如何在服务启动时自动执行SQL脚本,从而省去手动执行的步骤。它详细讲解了不同版本的配置差异,包括SpringBoot1.x和2.x,并解答了关于脚本执行顺序、重复执行以及无脚本配置的影响等疑问。同时,提到了该功能在小型项目中的适用性,但可能在服务重启时带来问题。

在开发当中我们每次发布服务都需要手动执行脚本,然后重启服务,而SpringBoot有服务启动自动执行sql脚本的功能的,可以为我们省去手动执行脚本的这一步,只需要部署新的服务即可。

这个功能是SpringBoot自带的不需要引入额外的依赖!

一、功能演示

通过如下配置项目在项目启动后会立马执行data-v1.0和schema-v1.0 的sql文件。

这个功能演示我使用的SpringBoot2.7.10版本,不同的SpringBoot版本对应的配置可能有所差距,比如SpringBoot1.x和2.x就会完全不一样(这里的不一样是配置文件的前缀不一样),具体版本之间的配置差异后面会讲解!

在这里插入图片描述
疑问一:万一sql文件创建的表,在项目启动的时候需要访问,会不会报异常?找不到表呢?

答案是不会的,sql文件执行优先于一切!

在这里插入图片描述

在这里插入图片描述

疑问二:多次启动项目,sql是否会每次都执行?

答案是会的,spring.sql.init.mode=ALWAYS其中的ALWAYS就是每次都执行的意思。假如执行过一遍后,可以改为NEVER,就是不执行的意思。

疑问三:配置了执行脚本,但是实际项目并没有脚本会影响启动吗?

答案是不会的

二、配置详解

这里以SpringBoot2.7.10版本配置进行讲解:

在这里插入图片描述

mode的枚举值:

  • ALWAYS:始终初始化数据库 Always initialize the database.
  • EMBEDDED:仅初始化嵌入式数据库 Only initialize an embedded database.(默认)
  • NEVER:从不初始化数据库 Never initialize the database.

除了配置schema和data可以自动执行脚本,通过platform也是可以自动执行脚本的,如下:

在这里插入图片描述

platform就算不配置,默认是为all,那也就意味着我们只要spring.sql.init.mode=ALWAYS开启了自动执行脚本,那他就会去执行schema-all.sql和data-all.sql。如果我们指定了schema-locations、data-locations,他就会去加载指定位置的文件。而platform不在起作用。

三、版本差异

这里我重点拿SpringBoot1.5.12.RELEASE 和 2.7两个版本进行讲解,

SpringBoot1.x的初始化sql配置都是以spring.datasource开头的,配置如下:

1.x当中没有spring.sql.init.mode,而是initialize控制是否开启的,除此之外配置都是一样的。

在这里插入图片描述

在这里插入图片描述

四、源码讲解

DataSourceAutoConfiguration是数据库资源自动配置类,也就是先有数据库再有执行sql。所以这里使用了这个注解。

在这里插入图片描述
SqlInitializationAutoConfiguration:
在这里插入图片描述

DataSourceInitializationConfiguration:

  • @ConditionalOnMissingBean({SqlDataSourceScriptDatabaseInitializer.class,SqlR2dbcScriptDatabaseInitializer.class}):bean不存在的时候注入
  • @ConditionalOnSingleCandidate(DataSource.class):表示ioc容器中只有一个DataSource类型的Bean,才生效
  • @ConditionalOnClass({DatabasePopulator.class}):主要是判断是否存在这个类文件,如果有这个文件就相当于满足条件,然后可以注入到容器当中。当然并不是说容器里面是否有这个类哈,不要理解错了,这也就是我们有时候使用springboot只需要引入个依赖,框架就可以用的原因!

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总体来说这个功能只适合用于demo练习,或者小型项目,因为万一服务哪天挂了要重启服务,而服务当中设置的自动执行sql并没有关闭,这样一来脚本又会自动执行,可能会带来不必要的一些麻烦!

### 如何在 IntelliJ IDEA 中配置 Spring Boot 项目启动时运行 SQL 脚本 为了实现 Spring Boot 项目在启动自动执行 SQL 脚本的功能,可以通过以下方式完成: #### 配置 `application.properties` 或 `application.yml` 通过设置 `spring.datasource.sql-script-encoding` 和指定初始化脚本路径来加载 SQL 文件。以下是具体的属性说明[^1]: ```properties # 数据库驱动和其他连接参数省略... spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password # 启动时运行的 SQL 脚本文件位置 spring.datasource.schema=classpath:schema.sql spring.datasource.data=classpath:data.sql # 设置编码防止中文乱码等问题 spring.datasource.sql-script-encoding=UTF-8 ``` 如果使用的是 YAML 格式的配置,则可以这样写: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC username: root password: password schema: classpath:schema.sql data: classpath:data.sql sql-script-encoding: UTF-8 ``` 上述配置中的 `schema.sql` 是用于创建表结构或其他数据库对象的脚本;而 `data.sql` 则通常用来填充初始数据。 #### 使用 Flyway 或 Liquibase 进行更复杂的迁移管理 对于较大型的应用程序或者需要版本化管理的数据变更操作,推荐采用专门工具如 **Flyway** 或者 **Liquibase** 来处理数据库迁移工作流[^2]。下面是一个简单的例子展示如何集成 Flyway: ##### 添加依赖到项目的 build.gradle (Gradle) ```gradle dependencies { implementation 'org.flywaydb:flyway-core' } ``` ##### 创建资源目录并放置 SQL 文件 按照约定好的命名规则,在 `src/main/resources/db/migration` 下新建 SQL 文件,例如命名为 V1__Initial_setup.sql : ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); INSERT INTO users(name, email) VALUES ('John Doe', 'john@example.com'); ``` 当应用程序启动的时候,Flyway 将会检测该目录下的所有脚本,并按顺序依次应用它们至目标数据库上。 #### 总结 无论是简单场景还是复杂需求下都有相应的解决方案支持开发者轻松达成目的——即让自己的 Spring Boot 应用能够在每次部署之前先准备好所需的环境状态。以上方法均已在实际开发过程中得到广泛应用验证有效可靠。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值