spring.sql.init 用于自动执行 SQL 脚本来创建数据库结构(Schema)和插入初始数据(Data)

Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用? 前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议。 弃用内容 先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调整,但其实并不是。这次重新设计的只是对Datasource脚本初始化机制的重新设计。 先来看看这次被弃用部分的内容(位于org.springframe 阅读详情

默认情况下,每次 Spring Boot 项目启动都会自动执行 spring.sql.init 配置的 SQL 脚本 —— 但前提是满足初始化条件。


✅ 关键结论:是否每次启动都执行?

条件是否执行?说明
spring.sql.init.mode=always✅ 是每次启动都执行,无论数据库是否存在或是否已初始化
spring.sql.init.mode=embedded✅ 仅当使用嵌入式数据库时执行如 H2、HSQL、Derby 等。非嵌入式数据库(如 MySQL、PostgreSQL)不执行
spring.sql.init.mode=never❌ 从不执行完全禁用初始化功能
数据库中已有表结构,且脚本中有 CREATE TABLE IF NOT EXISTS✅ 仍会执行脚本仍会被运行,但不会报错(因为用了 IF NOT EXISTS)
数据库中已有数据,脚本中有 INSERT✅ 仍会执行会重复插入数据,可能导致主键冲突或数据冗余!

🔥 重点提醒:
Spring Boot 的 spring.sql.init 是“无状态”的初始化机制 —— 它不会判断“是否已经初始化过”,它只认配置和脚本文件的存在!


📌 示例说明

场景 1:mode: always + 启动两次
spring:
  sql:
    init:
      mode: always
      schema-locations: classpath:schema-mysql.sql
      data-locations: classpath:data-mysql.sql
  • 第一次启动:
    • 执行 schema-mysql.sql → 创建 users 表
    • 执行 data-mysql.sql → 插入 3 条用户记录
  • 第二次启动:
    • 再次执行 schema-mysql.sql → 如果没有 IF NOT EXISTS,会报错(表已存在)
    • 再次执行 data-mysql.sql → 再次插入 3 条相同数据 → 可能违反唯一约束(如 username UNIQUE)

👉 结果:数据重复、主键冲突、应用启动失败!


✅ 如何避免重复执行导致的问题?

✅ 方法一:在 SQL 脚本中使用安全语法(推荐)
-- schema-mysql.sql
CREATE TABLE IF NOT EXISTS users ( ... );  -- 安全建表
CREATE TABLE IF NOT EXISTS roles ( ... );

-- data-mysql.sql
INSERT INTO users (username, email) 
SELECT 'admin', 'admin@example.com' 
WHERE NOT EXISTS (SELECT 1 FROM users WHERE username = 'admin');

✅ 使用 IF NOT EXISTS 和 WHERE NOT EXISTS 可以幂等执行(多次执行也不会出错或重复)

✅ 方法二:开发阶段用 mode: always,生产环境设为 never
# application-dev.yml(开发环境)
spring:
  sql:
    init:
      mode: always

# application-prod.yml(生产环境)
spring:
  sql:
    init:
      mode: never
✅ 方法三:改用 Flyway / Liquibase(生产推荐)

这两个工具会记录每个迁移脚本的执行状态(在 flyway_schema_history 表中),确保:

  • 每个脚本只执行一次
  • 支持版本控制、回滚、顺序执行
  • 适合团队协作和生产部署
<!-- Maven 依赖示例 -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

💡 最佳实践:
开发/测试 → 用 spring.sql.init 快速搭建
预生产/生产 → 必须改用 Flyway/Liquibase


🚫 常见错误场景(不加判断直接写 INSERT)

-- data-mysql.sql(错误写法)
INSERT INTO users VALUES (1, 'admin', 'admin@xxx.com');
INSERT INTO users VALUES (2, 'user1', 'user1@xxx.com');

→ 第二次启动时会报错:

Duplicate entry '1' for key 'PRIMARY'

因为你试图插入已存在的主键!


✅ 总结:什么时候会执行?

条件是否执行
mode=always✅ 每次启动都执行(危险!需幂等脚本)
mode=embedded✅ 仅嵌入式数据库(如 H2)启动时执行
mode=never❌ 从不执行
数据库不存在✅ 执行(会创建)
数据库存在但无表✅ 执行(建表)
数据库存在且有表✅ 仍然执行(可能报错或重复)

✅ 最佳建议(强烈推荐)

场景推荐做法
本地开发使用 mode: always + 幂等脚本(IF NOT EXISTS + WHERE NOT EXISTS)
单元测试使用 H2 + mode: always,每次测试前干净重建
CI/CD 测试环境使用 mode: always,配合内存数据库(H2)
预生产/生产环境禁用 spring.sql.init,改用 Flyway 或 Liquibase 管理数据库变更

🛠️ 附:如何快速验证是否被执行?

在 application.yml 中开启日志:

logging:
  level:
    org.springframework.boot.jdbc: DEBUG

启动后你会看到类似日志:

o.s.b.jdbc.init.ScriptStatementRunner : Executing SQL script from class path resource [schema-mysql.sql]
o.s.b.jdbc.init.ScriptStatementRunner : Executed SQL script from class path resource [schema-mysql.sql] in 45 ms.
o.s.b.jdbc.init.ScriptStatementRunner : Executing SQL script from class path resource [data-mysql.sql]
o.s.b.jdbc.init.ScriptStatementRunner : Executed SQL script from class path resource [data-mysql.sql] in 12 ms.

如果看到这些日志,就说明脚本被成功执行了。


✅ 一句话总结:

spring.sql.init 默认每次启动都执行脚本 —— 你必须自己保证脚本是“幂等”的,否则就会出错!
生产环境请务必改用 Flyway/Liquibase!

db-migration 2.2.1 集成达梦 DM 8:Spring Boot 3.2.x 下 Flyway 10.10.0 配置 3 步 本文详细介绍了在Spring Boot 3.2.x项目中集成达梦DM 8数据库与Flyway 10.10.0的实战指南。通过三步配置流程,包括环境准备、数据库连接配置和迁移脚本开发,帮助开发者快速实现国产数据库的版本控制管理。特别针对达梦数据库特性提供了SQL语法适配建议和常见问题解决方案,提升企业级应用开发效率。 阅读详情

相关推荐

JUnit单元测试性能优化实战:7大方法解决测试执行慢难题

单元测试是软件工程中保障代码质量、实现快速反馈的核心实践。其核心原理在于隔离被测代码,通过自动化验证确保逻辑正确性。在持续集成与敏捷开发流程中,高效的单元测试能显著提升开发效率与代码可靠性。然而,随着项目规模增长,测试套件执行缓慢成为常见痛点,直接影响开发节奏。本文聚焦于Java项目中JUnit测试的性能优化,深入剖析了导致测试缓慢的根源,如外部依赖、Spring上下文加载与测试设计不当。通过系统性地应用Mock框架、优化Spring测试策略、并行执行等工程实践,可以有效解决绝大多数性能瓶颈,让测试回归“快

708

MySQL查询性能分析:用SHOW PROFILE快速定位SQL瓶颈

MySQL查询性能分析是数据库调优的基础能力,其核心在于通过语句级时间采样揭示SQL执行各阶段的真实耗时。原理上,它依托Server层12个标准执行阶段的毫秒级计时,精准反映解析、优化、锁等待、IO读写等底层行为。该技术具备零侵入、低开销、高时效的特点,无需修改代码或重启服务,特别适合开发自测与线上应急诊断。典型应用场景包括慢接口根因排查、索引有效性验证、内存与磁盘临时表问题识别,以及亚秒级‘伪健康’查询的深度剖析。本文聚焦MySQL原生`SHOW PROFILE`机制,结合`Sending data`、`

weixin_30784501的博客 457

Spring Boot整合MyBatis-Plus实现高效CRUD开发

ORM框架是Java开发中处理数据库操作的核心组件,MyBatis作为主流选择以其灵活性著称。MyBatis-Plus在MyBatis基础上进行了增强,通过自动化CRUD操作和条件构造器等功能,显著提升开发效率。结合Spring Boot的自动化配置特性,开发者可以快速构建高性能数据访问层。这种组合特别适合需要快速迭代的业务系统,能减少60%以上的样板代码。在实际工程中,MyBatis-Plus的条件构造器和分页插件等特性,为处理用户管理、订单系统等常见业务场景提供了标准化解决方案。

cigang4063的博客 389

Spring Boot 2.6.7 初始化 MySQL 数据库

有些场景,需要我们在项目启动的时候,初始化数据库表。JPA 虽然能达到很好的功能,但是我们用的是 Mybatis Plus,因此使用 Spring 官方提供的启动项目时初始化 sql 的功能。

Java Pro 1825

自研MySQL REST数据服务(MRDS):从零到一的快速API化实践

本文详细介绍了自研MySQL REST数据服务(MRDS)的快速API化实践,通过自动生成CRUD接口大幅提升开发效率。文章涵盖从Docker部署、核心功能解析到生产环境优化,帮助开发者快速实现MySQL数据的RESTful API化,适用于快速原型开发和企业数据中台建设。

weixin_34221112的博客 544

避坑指南:在Ubuntu 20.04上从零部署IS-Fusion环境(含CUDA 11.1和PyTorch 1.10.1配置)

本文提供了在Ubuntu 20.04系统上从零部署IS-Fusion 3D目标检测环境的详细避坑指南。内容涵盖CUDA 11.1、PyTorch 1.10.1、spconv等核心组件的精确版本安装与兼容性配置,并指导如何准备nuScenes数据集及启动模型训练,旨在帮助研究者和开发者高效搭建稳定的多模态融合算法开发环境。

gitlab7runner的博客 551

重新设计的spring.sql.init 配置有啥用?

弃用内容 先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调整,但其实并不是。这次重新设计的只是对Datasource脚本初始化机制的重新设计。 先来看看这次被弃用部分的内容(位于org.springframework.boot.autoconfigure.jdbc.DataSourceProperties),如果你有用过这些配置内容,那么新配置就很容易理解了。 /** * Mode to apply when determ

weixin_45032957的博客 3766

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

SpringBoot启动自动执行sql脚本

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

怪咖@的博客 8153

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3307

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 1万+

Springboot使用spring.sql.init.schema-locations 初始化数据库脚本所遇问题(坑爹的PostgreSQL的美元符号)

其实实现这个需求有多种方式(这里我不多啰嗦,各位可以自行百度),我采用的是spring.sql.init.schema-locations配置创建数据库和主键索引的SQL语句,使用spring.sql.init.data-locations初始化表数据,使用简单明了。赶紧分析一下,我语句没有问题,navicat可以执行,那只能是spring在解析sql语句后执行出错了。是不是看着什么问题也没有,是不是很简单,我当时也是这么认为,而且我在navicat中执行也没有任何问题。愿工作中没有BUG!

kiss002wk的博客 1484

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 895

springboot启动 初始化sql_Spring 数据初始化的时候没有执行 SQL

Spring Boot 项目在启动的时候可以对 H2 中的数据库进行初始化。一般来说我们会定义下面的参数:spring.datasource.data=classpath:h2-data.sql但是在 Spring Boot 项目运行以后,我们通过 H2 的控制台查看数据库的时候,发现 SQL 脚本没有执行。问题原因和解决我们都知道 Spring 数据库有下面 2 个配置参数:spring.dat...

weixin_29826879的博客 1082

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 356

【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

大家好,我是阿光。本专栏整理了《深度学习100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨。

优快云 精品推荐 10万+

使用Testcontainers与Flyway实现数据库迁移脚本的自动化集成测试

数据库迁移脚本是保障应用数据结构演进与数据一致性的关键技术,其核心原理是通过版本化的SQL脚本实现数据库Schema的迭代更新。在持续集成与交付流程中,确保迁移脚本在生产环境的可靠性至关重要。传统使用内存数据库进行测试的方法存在兼容性风险,无法完全模拟真实数据库环境。通过结合Testcontainers启动真实数据库容器与Flyway执行迁移脚本,可以构建高置信度的自动化验证防线。这种技术方案能够覆盖从空库到最新版本的完整迁移链,验证脚本间的依赖关系与数据约束,有效避免因环境差异导致的线上事故。在微服务架构

weixin_30645617的博客 499

云原生监控:Prometheus+Grafana监控Nginx实战

在云原生环境中,应用的高可用性和性能优化至关重要。Nginx作为一款广泛使用的高性能Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,对其进行有效的监控能够及时发现潜在问题,保障服务的稳定运行。本文章的目的是详细介绍如何使用Prometheus和Grafana构建一套完整的监控系统来监控Nginx,范围涵盖从环境搭建、数据采集、存储到可视化展示的整个流程。

AI云原生与云计算技术学院 1574

Java单元测试实践-26.利用H2内存数据库实现快速隔离的DAO层测试

本文详细介绍了如何利用H2内存数据库实现快速隔离的DAO层单元测试,解决传统测试中数据库依赖问题。通过Spring Boot项目实战,展示H2的闪电启动速度、完美隔离性和自动清理特性,帮助开发者提升测试效率与稳定性。

conghuang7343的博客 439

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36

《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36

道友 198

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SSM框架整合(Spring + Spring MVC + Mybatis)

本文介绍了使用IDEA 2026.1搭建SSM(Spring+SpringMVC+MyBatis)项目的详细步骤。首先说明了环境配置(JDK17、Maven3.6.3)和核心配置文件的作用,包括pom.xml、web.xml等。然后通过SQL脚本创建了ssm数据库和book表,并插入测试数据。项目搭建部分演示了如何创建Maven Web项目,修改pom.xml添加Spring、MyBatis、MySQL等依赖,并配置了构建插件。整个过程涵盖了从环境准备到项目初始化的关键环节,为后续开发奠定了基础。

城南蝈蝈 1229

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据库版本管理利器Flyway:原理、实践与生产环境部署指南

数据库版本管理是软件工程中确保环境一致性和发布可靠性的关键技术。其核心原理是通过版本控制机制追踪数据库结构(Schema)与数据的变更历史,实现变更的可重复、自动化应用。这一技术为团队协作、持续集成与持续交付(CI/CD)提供了坚实基础,能有效解决开发、测试、生产环境数据库状态不一致的痛点。在实际应用中,数据库版本管理工具通过约定大于配置的方式,扫描并顺序执行迁移脚本,同时利用元数据表记录执行状态,确保幂等性。Flyway作为该领域的代表性开源工具,将这一理念工程化,支持纯SQL和Java迁移脚本,并可与S

weixin_30675247的博客 291

从自然语言到SQL:用FastAPI构建LLM数据库查询机器人

企业数据查询常因SQL门槛而依赖开发排期,自然语言查询接口应运而生。其核心原理是让大模型将用户提问转换为SQL,再通过校验与执行层完成数据检索。这一技术能显著降低数据获取成本,提升业务自助分析效率,适合报表系统、内部数据服务等场景。本文给出一个基于FastAPI和SQLite的最小实现,涵盖表结构提取、Prompt组装、SQL安全校验与只读执行,并探讨生产化所需的安全基线,帮助企业快速搭建可落地的数据库问答工具。

722

Spring系列——两万字长文教会你Spring (超详细!!!)

到此,我们学习完了 Spring 框架,包括: Spring 体系结构 Spring Bean Spring AOP Spring JDBC Spring 事务管理 写此文章是为了做个笔记,等以后自己忘记了可以回头快速上手。同时也分享给小伙伴们,希望我们都能越来越好,不会就学 B 站,不懂就问 AI,总好过自己两耳不闻窗外事的独自琢磨。 最后认识一下吧,笔者叫`北迁`,hhh~~。

weixin_63009611的博客 1181

Spring Boot DAO层测试进阶:连接池复用、事务回滚与低耦合设计

在Java后端开发中,数据访问层(DAO)是连接应用与数据库的核心组件,其稳定性直接影响系统可靠性。DAO层测试的核心原理在于模拟数据库交互,验证数据持久化逻辑的正确性。通过引入连接池复用机制,可以显著提升测试执行速度,避免频繁创建销毁连接的开销。结合Spring的声明式事务管理,利用@Transactional注解实现测试方法的自动回滚,确保每个测试用例在独立、隔离的环境中运行,彻底解决数据污染问题。这种技术组合的工程价值在于为团队构建快速反馈的开发闭环,保障代码库的长期健康度。在实际应用场景中,尤其在S

cnmik42448的专栏 425

Spring Boot与MyBatis-Plus整合开发实战指南

在Java企业级开发中,ORM框架是连接应用与数据库的关键组件。MyBatis作为半自动化ORM框架,通过XML/注解配置实现SQL与代码解耦,而MyBatis-Plus在其基础上提供了自动化CRUD、条件构造器等增强功能,显著提升开发效率。结合Spring Boot的自动配置特性,开发者可以快速构建高性能数据访问层。这种技术组合特别适合需要快速迭代的中大型项目,例如电商系统后台开发中,能减少60%以上的样板代码。通过条件构造器、分页插件等核心功能,开发者可以轻松实现复杂查询与批量操作,同时保持代码的可维护

weixin_30650039的博客 612
上一篇: 完整 PostgreSQL 数据库建表脚本参考示例
下一篇: 9、缓存预热是提升系统启动后性能的关键手段
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值