本篇解决 Spring 执行SQL脚本(文件)的问题。

场景描述可以不看。

场景描述:

我在运行单测的时候,也就是 Spring 工程启动的时候,Spring 会去执行 classpath:schema.sql(后面会解释),我想利用这一点,解决一个问题:

一次运行多个测试文件,每个文件先后独立运行,而上一个文件创建的数据,会对下一个文件运行时造成影响,所以我要在每个文件执行完成之后,重置数据库,不单单是把数据删掉,而 schema.sql 里面有 drop table 和create table。

解决方法:

//Schema 处理器
@Component
public class SchemaHandler {private final String SCHEMA_SQL = "classpath:schema.sql";@Autowiredprivate DataSource datasource;@Autowiredprivate SpringContextGetter springContextGetter;public void execute() throws Exception {Resource resource = springContextGetter.getApplicationContext().getResource(SCHEMA_SQL);ScriptUtils.executeSqlScript(datasource.getConnection(), resource);}
}// 获取 ApplicationContext
@Component
public class SpringContextGetter implements ApplicationContextAware {private ApplicationContext applicationContext;public ApplicationContext getApplicationContext() {return applicationContext;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}

备注:

关于为何 Spring 会去执行 classpath:schema.sql,可以参考源码

org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer#runSchemaScripts

private void runSchemaScripts() {List<Resource> scripts = getScripts("spring.datasource.schema",this.properties.getSchema(), "schema");if (!scripts.isEmpty()) {String username = this.properties.getSchemaUsername();String password = this.properties.getSchemaPassword();runScripts(scripts, username, password);try {this.applicationContext.publishEvent(new DataSourceInitializedEvent(this.dataSource));// The listener might not be registered yet, so don't rely on it.if (!this.initialized) {runDataScripts();this.initialized = true;}}catch (IllegalStateException ex) {logger.warn("Could not send event to complete DataSource initialization ("+ ex.getMessage() + ")");}}}/*** 默认拿 classpath*:schema-all.sql 和 classpath*:schema.sql*/
private List<Resource> getScripts(String propertyName, List<String> resources,String fallback) {if (resources != null) {return getResources(propertyName, resources, true);}String platform = this.properties.getPlatform();List<String> fallbackResources = new ArrayList<String>();fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql");fallbackResources.add("classpath*:" + fallback + ".sql");return getResources(propertyName, fallbackResources, false);}

参考:https://github.com/spring-pro...

原文链接:
http://zhige.me/2019/02/28/20...

Spring 执行 sql 脚本(文件)相关推荐

  1. Delphi 7 在程序中直接执行SQL脚本文件

    Delphi 7 在程序中直接执行SQL脚本文件 在处理MSDE一些操作中.需要执行一些SQL脚本.有的是从 SQLServer 2000中生成的SQL为后缀的脚本.在MSDE中没有企业管理器, 操作 ...

  2. Oracle 在Sqlplus 执行sql脚本文件。

    首先在随便1个地方建立1个sql语句的文件. 例如: 执行命令为: sqlplus loginID/passwd@serverIP/servcie_name @path/file.name 例如: 见 ...

  3. source命令执行SQL脚本文件

    2019独角兽企业重金招聘Python工程师标准>>> 运行mysql,可以使用"source"或"/."命令执行SQL脚本文件: mysql ...

  4. PLSQL执行SQL脚本文件「适用批量」- 工具使用篇

    前言 开局一条狗,装备全靠打 这篇文章应该是 2019 年最后一文章了,分享一下 PLSQL 是如何执行 SQL 脚本文件的. 关于执行 SQL 文件,下方是自己经常使用的一种方式,同样适用于批量文件 ...

  5. 如何在mysql中执行sql脚本文件

    一.sql脚本文件 简介 xxxx.sql这种文件被称为sql脚本文件. sql脚本文件中编写了大量的sql语句. 我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行! 批量的执行SQL ...

  6. java sql脚本_Java 执行 SQL 脚本文件

    是拷贝的别人的,以备学习 package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import ...

  7. oracle用命令执行sql脚本文件

    当sql命令过多(sql文件过大)时,用plsql执行时比较慢而且容易超时,此时可以用sqlplus命令直接执行sql脚本文件,方法如下: 1.sqlplus登录 >sqlplus userna ...

  8. Mac OS 在远程主机(Linux 系统)上使用命令执行 sql 脚本文件(使用的是 MySQL 数据库)

    文章目录 使用命令 mysql 执行脚本文件 连接远程主机后,直接使用命令 mysql 进入 MySQL 的 bin 目录后,再执行 mysql 命令 使用命令 source 执行脚本文件 sql 脚 ...

  9. Windows 使用命令执行 sql 脚本文件

    文章目录 MySQL 数据库 方法一:使用 mysql 命令 方法二:使用 source 命令 Oracle 数据库 MySQL 数据库 方法一:使用 mysql 命令 未配置 MySQL 的环境变量 ...

最新文章

  1. Java同一个类的不同实例_如何创建2个类实例注入不同类的依赖项实现(通过guice)?...
  2. iPad mini时隔四年更新,搭载A12芯片,起售价2999
  3. mysql中count的用法
  4. 我最佩服的一位同学!他是哈工大在读NLP博士积累28W粉丝
  5. 使用SpringBoot Admin监控SpringCloud微服务
  6. c 编程语言概述,C编程语言概述
  7. 在Windows 下使用OpenCL
  8. html在excel打开是乱码,excel打开xls格式乱码怎么办excel表格乱码的修复方法
  9. 使用DB2遇到的一些错误SQLCODE=-551,SQLCODE: -204,SQLCODE:-433,SQLCODE: -104,rg.springframework.beans.factory.B
  10. 基于线程池实现多线程任务
  11. 2019-04-26周五宁波和杭州都下雨了,晚饭的鱼粉好大份哦,这是我第一次吃鱼粉!Hhhhhhhh下雨了就给吃点面才暖和,辛苦快递小哥哥了呀,其实这家店就在食堂我看见很多次了懒得买,外卖好像更便宜!
  12. google sdk speech-to-text(谷歌语音转文本、谷歌语音转字幕)
  13. 设置.exe程序图标(ico文件)
  14. 用于机器学习的 NumPy(ML)
  15. Mac下的spotlight无法搜索本地资源的解决办法
  16. 图像处理之Matlab图像读取
  17. 互联网早报:腾讯推出“微小号”,用虚拟手机号拨打电话收发短信
  18. secureCRT安装失败,path注册失败,绿色汉化版
  19. 【转】Numpy 数学函数及代数运算
  20. VS2017创建MFC ActiveX工程制作IE OCX插件

热门文章

  1. Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
  2. 模拟物流快递系统程序设计java_路辉物流设备:大件快递自动分拣系统的模块化设计...
  3. 写一个逻辑清晰的startActivityForResult(),拒绝来回扒拉代码
  4. ubuntu笔记:查看Ubuntu的包依赖关系
  5. 服务器双系统设置默认,服务器双系统怎么选择
  6. LeetCode 198 House Robber Python
  7. 认清js中var a=b=1和var a=1,b=1的区别
  8. matlab 单元,MATLAB单元阵列
  9. foreach 二维java_教你如何用for和foreach循环遍历java中的二维数组
  10. 用git rebase合并