博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 执行 sql 脚本(文件)
阅读量:5996 次
发布时间:2019-06-20

本文共 2901 字,大约阅读时间需要 9 分钟。

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

场景描述可以不看。

场景描述:

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

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

解决方法:

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

备注:

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

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

private void runSchemaScripts() {        List
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
getScripts(String propertyName, List
resources, String fallback) { if (resources != null) { return getResources(propertyName, resources, true); } String platform = this.properties.getPlatform(); List
fallbackResources = new ArrayList
(); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return getResources(propertyName, fallbackResources, false); }

参考:

原文链接:

转载地址:http://tgqlx.baihongyu.com/

你可能感兴趣的文章
ORA-12720: operation requires database is in EXCLUSIVE mode
查看>>
ELK日志服务使用-kafka传输日志(bbotte.com)
查看>>
linux系统之iptables其二命令注解
查看>>
Silverlight C# 游戏开发:高深莫测却浅显易懂的游戏开发
查看>>
标准ACL+扩展ACL+命名ACL
查看>>
Linux常用的基本命令14
查看>>
《zabbix进程组成结构与zabbix_agentd.conf配置文件参数详解》-3
查看>>
8-22学习练习[一个viewController整合增删移动功能]
查看>>
MySQL的字符集
查看>>
Selenium2+python自动化63-简易项目搭建
查看>>
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 解决方案
查看>>
centos7 安装mysql5.7.11注意事项
查看>>
[20150727]''与NULL.txt
查看>>
上海往事之教会宝宝学游泳
查看>>
SharePoint 2013 图文开发系列之创建内容类型
查看>>
cookie 简介
查看>>
ios和android内嵌h5页面联调小结
查看>>
两种jdk版本的多个tomcat按windows服务的安装问题的解决
查看>>
为IE创建更好的XMLHttpRequest对象
查看>>
java 图片 批量 压缩 +全部压缩
查看>>