Spring执行sql脚本文件的方法
2020-04-04 07:06
651 查看
本篇解决 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"; @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 @Component public 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<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-projects/spring-boot/issues/9048
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- C#执行SQL脚本文件(三中方法)
- .net下执行SQL文件脚本
- 直接附加数据库的批处理文件 和 执行sql 脚本的批处理文件的写法
- Oracle 在Sqlplus 执行sql脚本文件。
- 如何在C#中用程序执行指定的SQL脚本文件,实现自动安装创建数据库.txt
- SQLserver 2008将数据导出到Sql脚本文件的方法
- mysql执行sql脚本文件
- 如何执行一个mysql的sql脚本文件
- MySql下如何执行sql脚本文件
- SQL 2008将数据导出到Sql脚本文件的方法
- C# 执行SQL脚本文件
- 执行mysql脚本文件方法
- sql 2000 无法执行查询,因为一些文件缺少或未注册"的解决方法
- mysql执行sql脚本文件
- 如何得到服务器端sql执行脚本的方法
- SQLserver 2008将数据导出到Sql脚本文件的方法
- 批处理执行多个oracle sql文件的方法
- Apache服务器上传文件夹设置禁止执行脚本文件方法
- 如何在java环境下执行sql脚本文件
- 给朋友写了一个从脚本文件逐行加载执行SQL语句的程序,现在分享给将来需要的朋友们参考