SpringBoot启动自动执行sql脚本

article/2025/9/14 10:31:52

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


http://chatgpt.dhexx.cn/article/i8fuICHy.shtml

相关文章

Excel数据转化为sql脚本

在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况。这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库。 1 在数据前插入一列单元格,用来拼写sql语句。 具体写法:"insert into t_student (id,name,ag…

MySQL导出sql脚本文件

⭐️前言⭐️ sql脚本文件在我们做项目时,特别是学习别人的开源项目时经常需要进行导入导出操作,才能在自己的系统上跑起来,这篇文章主要介绍如何导出sql脚本文件,具体操作如下,附带截图详解。 🍉博客主页…

dataGrip导出sql脚本

1.打开dataGrip。 2.选择要导出的数据库表。 3.点击右键->选择"Dump Data to File(s)", 同时选择,Skip Computed Columns(sql),Add Table Definition(sql),Overwrite Exsting Files和Single File。 4.点击sql Inserts 5.选择文件保存位置 6.生成sql脚…

linux下plsql怎么执行sql脚本,plsql怎么执行sql脚本

首先,我们需要登录需要执行sql文件的用户,在我们确保sql文件无误的情况下,进入plsqldeveloper: 1,找到tools---》import tables ---》选择sql insert,不要选中sqlplus,选择最下面的那个导入sql文件,选中好sql文件后,点击import就会执行sql语句,生成日志。 2,如果执行…

DBeaver执行SQL脚本文件

1、右键库名,点击工具-->执行脚本 2、在弹出窗口中选择输入文件,并修改Extra command args:--default-character-setutf8,防止中文乱码,点击开始按钮。 3、执行完成。

kettle执行SQL脚本

参考一下kettle官方文档 kettle什么时候需要创建临时表呢 SELECT * WHERE cid IN(xxx) 的数据太多,占了很大内存。 目标表有没有必要做逻辑删除,如果做逻辑删除,后期数据量增长过快。 目标表增量更新:1、sql直接插入&#xff1…

SQL Server SQL脚本

本节的主要内容是要教大家怎么通过编写 SQL 脚本来查询、更新并且运行数据库。 利用 SQL 脚本我们能做很多事情,比如插入数据、读取数据、更新数据以及删除数据等;它们也可以用于创建数据库对象,如表,视图,存储过程&a…

SQL Server 数据库之生成与执行 SQL 脚本

生成与执行 SQL 脚本 1. 将数据库生成2. 将数据表生成 SQL 脚本4. 执行 SQL 脚本 1. 将数据库生成 使用对象资源管理器能快速创建整个数据的脚本,也能使用默认选项创建单个数据库对象的脚本; 用户能在查询编辑器窗口中对文件或剪贴板创建脚本&#xff0…

SQL 常用脚本大全

1、行转列的用法PIVOT CREATE table test (id int,name nvarchar(20),quarter int,number int) insert into test values(1,N苹果,1,1000) insert into test values(1,N苹果,2,2000) insert into test values(1,N苹果,3,4000) insert into test values(1,N苹果,4,5000) insert …

打砖游戏,详解每一行代码,历经三个小时解析,初学可看

打转游戏详解版 网上只要搜一下“打砖游戏”,基本会看到很多一样的代码,主要是注释也很少,对于python不熟悉的人来说,根本看不懂,只会拿来运行着玩玩。 于是我历经三个小时,把代码几乎每一行都注释了一遍&…

今天开始敲代码

新手小白今天开始自学敲代码了呜呜呜 加油加油加油

开发12年,整整6百万行代码,史上最烂的开发项目长这样

程序员(ID:imkuqin)猿妹编译 原文:https://projectfailures.wordpress.com 最近有个史称世界上最烂的开发项目在朋友圈刷屏,这个项目到底有多烂呢? 这个项目拖了整整12年,造出6百万行代码&#…

“低代码”抢走程序员的饭碗?没有的事

编者按:眼下发展势头正猛的低代码,承受着两种截然不同的声音。一种声音觉得低代码是“减负”神器,可以帮助减轻开发工作量,大幅提升开发效率;另一种声音却觉得低代码非“善类”(主要是程序员群体&#xff0…

程序是如何跑起来的

一个简单的11?的问题对于我们而言就是脱口而出,而对于计算机却不是这样。 那么当我们用从c语言或者其他高级语言来写的时候计算机是如何工作运算加法(其他原理类似)的呢? 当c语言由编写到运行程序需要经过 1.预处理 2.编译 …

据说程序员写完代码是这个样子,99%的人都中枪了

点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 1、当你改错一行代码的时候 2、当你想要重构别人的代码时 3、当你尝试想要修复一个bug时的样子 4、当你凌晨4点还在工作时的样子 5、星期五下午项目经理给你分配任务时的样…

祖传代码千万别动

IT程序猿 微博网友评论: 洞侠X:祖传 爱因斯坦老道士:这是傻啊 砸自己脚下的 前端折腾小能手:嗯 sunnysab:想要改进代码的时候 精彩回顾 ♡ 程序员究竟能干多少年? ♡ 互联网公司各岗位真实工作内容起底 ♡ …

泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?

大多数互联网的从业者都有一个梦想:进大厂。 因为不仅可以享受较好的福利待遇,也能与更优秀的人一起共事,获得更专业、更快速的成长。 最近经常有朋友提及想要入门编程学习,该如何学习? 关于编程学习,各…

刚进公司就把祖上十八代单传的代码优化了是什么体验?

刚进公司就把祖传代码优化了,让公司的APP稳定性提高一半,大幅提升了用户体验是什么体验? 一个字!爽! 这不比斗破里面萧炎“三年之期”打脸嫣然来的爽?不比博人传燃?爽文小说都不敢这么写。 关键,没人信啊。 扮猪吃老虎的大佬 去年金三银四帮公司面试的时候认识了…

百行代码手撸扫雷(下)c/c++

在上一篇文章中已经带大家如何搭建开发环境了 需求分析 这里是一个8*8的地图 地雷随机分布数字表示周围一共有多少颗雷 数字1表示红色区域内有1课雷,2表示有两颗 如何显示数字 右上角没有如何判断呢?行加1或列加一不就越界了吗,所以为了帮面条件判断我们把8行8列改成10行1…

面向祖传代码 Debug,我挽回了一位准备跑路的程序员

交流群的风格突然骤变,没有了往日的灌水扯淡,居然聊起了技术。 看了大家的全部的聊天记录,发现问题并没解决。群里难得这么多人聊技术,抱着问答不断,必有回响的原则,主动勾搭一起看看是什么问题。 大概了解…