SpringBoot启动自动执行sql脚本

news2024/11/17 23:50:54

在开发当中我们每次发布服务都需要手动执行脚本,然后重启服务,而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://www.coloradmin.cn/o/451808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 提取内存密码

访问 /actuator/heapdump 下载内存,提取密码 select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))

学习系统编程No.21【进程间通信之共享内存】

引言: 北京时间:2023/4/16/21:53,刚刚把新文章发出去,开完班会回来,本来上篇博客在昨天就能发的,昨天下午打了一下午的羽毛球之后,饭都没吃,躺在床上,准备睡觉&#xff…

Spring五大类注解 || Bean的更简单存储

目录 前言: 五大类注解 Controller Service Repository Component Configuration JavaEE标准分层 阿里分层结构 BeanName命名规则 方法注解 Bean 注入方式取Bean 属性注入 Setter注入 构造方法注入 Resource 前言: 使用Spring容器&…

Linux-驱动开发-基础温习

一、裸机开发和驱动开发的区别: 裸机开发:底层(相对于linux来说),库 二、linux驱动开发-根据各种框架进行开发 1、 外设比较多,资源多,资料非常少,官方的SDK;直接操作寄存器不显示…

Python 基础(十):元组

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、声明元组二、访问元组三、修改元组变量四、遍历元组五、切片六、常用函数和方法6.…

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现,前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的,不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。 3 实现思路 后端查询…

103. 二叉树的锯齿形层序遍历【191】

难度等级:中等 上一篇算法: 104. 二叉树的最大深度【75】 力扣此题地址: 103. 二叉树的锯齿形层序遍历 - 力扣(Leetcode) 1.题目:103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其…

p65 内网安全-域环境工作组局域网探针方案

数据来源 基本概念 DMZ区域:称为“隔离区”,也称‘’非军事化区/停火区” 工作组(Work Group)是局域网中的一个概念。它是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以…

完美解决丨except NameError:

示例如下: try: print(xx) except: print(xx is not defined) print(continue) 解决办法 第一种解决办法: try: print(xx) except NameError: print(xx is not defined) print(continue) 第二种解决办法: print(xx) if xx in locals() e…

camunda工作流user task如何使用

在Camunda中使用User Task通常需要以下步骤: 1、创建User Task:使用BPMN 2.0图形化设计器(如Camunda Modeler),将User Task元素拖到流程图中,并为任务命名,指定参与者(用户或用户组…

第二章 Maven 核心程序解压和配置

第一节 Maven核心程序解压与配置 1、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 下载链接: 具体下载地址:https://dlcdn.apac…

算法:(力扣)(牛客)打印螺旋矩阵题

手撕螺旋矩阵 题目思路解题 题目 描述:给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。数据范围:0 \le n,m \le 100≤n,m≤10,矩阵中任意元素都满足 |val| \le 100∣val…

makefile 规则的覆盖

makefile 中经常会使用规则的覆盖,同样一个target 可能有多个prerequisites,这种依赖关系可以放到一起,也可以分开指定。 例1: test1:echo "test111"test2:echo "test222"test3:echo "test333"he…

vsync-app 不稳定导致抖动

问题描述:跟对比机器对比uc 浏览器新闻页滑动场景,出现抖动 1、trace 看是没有丢帧,对比看送帧buffer 给到 SF 步调不够一致,从间隔较大的两个 送帧buffer看,发现vsync-app 时间比正常的要长3ms 左右,vsync…

网络交换机端口管理工具

如今,企业或组织级网络使用数百个交换机端口作为其 IT 基础架构的一部分来实现网络连接。这使得交换机端口管理成为日常网络管理任务的一部分。传统上,网络管理员必须依靠手动网络交换机端口管理技术来跟踪交换机及其端口连接状态。这种手动任务弊大于利…

基于斯坦福大学开源,从零搭建chatGPT

下载地址: https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T 预处理仓库:https://github.com/togethercomputer/RedPajama-Data 复刻ChatGPT!斯坦福等开启红睡衣计划,开源1.2万亿token训练集 【新智元导读…

JAVA队列(Queue)用法附实例讲解

队列是什么 队列用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素 …

【JavaWeb】Servlet(崔老师版)

文章目录 1.概述1.1 JavaWeb三大组件1.2 Servlet作用 2.ServletConfig接口3.Servlet接口3.1 实现Servlet的方式3.2 Servlet生命周期 4.HttpServlet抽象类6.ServletContext5.1 概述5.2 获取ServletContext5.3 JavaWeb四大域对象5.4 获取应用初始化参数5.5 ServletContext获取资源…

【UML建模】时序图(Sequence Diagram)

文章目录 1.概述2.时序图的组成元素2.1.角色(Actor)2.2.实体和对象2.3.生命周期线(Lifeline)2.3.1.激活(Activation)2.3.2.消息(Messages)2.3.3.组合片段(Fragments&…

learn C++ NO.1——命名空间域、输入输出、函数重载

前言 什么是C C(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的…