您现在的位置是:首页 >技术交流 >SpringBoot启动自动执行sql脚本网站首页技术交流

SpringBoot启动自动执行sql脚本

怪 咖@ 2023-06-06 12:00:03
简介SpringBoot启动自动执行sql脚本

在开发当中我们每次发布服务都需要手动执行脚本,然后重启服务,而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并没有关闭,这样一来脚本又会自动执行,可能会带来不必要的一些麻烦!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。