2016-08-13 269 views
0

我想测试使用SQLite JDBC驱动程序的手写DAO。我的计划是将模式和数据插入的版本控制保存为.sql文件,并在测试之前执行它们以获取可用于测试的填充数据库。使用JDBC执行.sql文件

搜索使用JDBC执行整个sql脚本的解决方案时,出现了一堆Stackoverflow线程,说这是不可能的,并提供了一些将sql脚本拆分为单独的sql语句(SQLScriptRunner)的解析脚本。

这些帖子主要是3岁以上,所以我想知道是否仍然没有“简单”的方式来执行使用JDBC API的SQL脚本。

我在问,因为SQLite为我提供了一个从现有数据库克隆数据库的选项,我希望使用一个大的Script-Executer实现(执行器可能比我的所有数据访问代码更大)。

那么,有没有一个容易的方法来使用JDBC执行sql脚本,还是只能使用一些解析脚本?

+3

不,没有。 – OldProgrammer

回答

1

我想春季框架ScriptUtils可能会为你做这个技巧。

请检查

http://docs.spring.io/autorepo/docs/spring/4.0.9.RELEASE/javadoc-api/org/springframework/jdbc/datasource/init/ScriptUtils.html

我的计划是保留的模式和数据插入版本控制 为.sql文件,并在测试之前执行他们得到一个人口 数据库,我可以用于测试。

为此有作为DbUnit的http://dbunit.sourceforge.net/

,我个人觉得有点棘手没有propper包装使用这些库。

其中一些包装的:

弹簧试验的DbUnithttps://springtestdbunit.github.io/spring-test-dbunit/

Unitils的DbUnithttp://www.unitils.org/tutorial-database.html

+0

我看到DbUnit在其他文章中被提及很多,如果我有更多的数据库代码需要在将来测试,我可能会使用它。 Spring看起来非常好,但Spring对于ScriptLoader来说是一个非常大的依赖。我可能会重构我的应用程序以在未来使用更大的框架 - 如果是Spring,我将利用它! –

+1

Spring Framework是**高度模块化的**项目。该类位于** spring-jdbc **模块内部,该模块还包含许多用于jdbc代码的有用类。 JdbcTemplate和NamedParameterJdbcTemplate只是很好的类,你应该在你的DAO类中使用。他们处理关闭/打开连接,提供了很多有用的方法,例如queryForObject,queryForList,并且通常会使写入jdbc代码更愉快。你应该考虑使用它! –

+0

我不知道它被分裂了,谢谢你提及! –

0

虽然不是一个 “开箱即用” JDBC的解决方案,我会倾向于使用SqlTool。它对HSQLDB特别友好,但可用于(几乎?)任何JDBC驱动程序。 (该文档显示了如何与PostgreSQL,SQL Server,Oracle,Derby等连接的示例)它可通过Maven获得,JAR文件仅为〜150KB。有关如何使用它运行SQL脚本的示例,请参阅我的其他答案here

关于拟议的春天“ScriptUtils”在你的问题的意见的光解决方案...

我宁愿[一些其他的解决方案]在使用大脚本的执行器执行(执行者大概会比我的所有数据访问代码都大)。

...请注意,spring-jdbc的依存关系包括总共为〜2.5MB的spring-core,spring-beans,spring-txcommons-logging-1.2。这比SqlTool JAR文件大15倍,它甚至不包含任何额外的DbUnit“包装器”,可能或不需要使ScriptUtils更易于使用。

+0

所有解决方案(包括SqlTools)都不是我正在寻找的。 DbUnit与spring-jdbc结合起来可能会解决我所有的问题,但仅在sqlite数据库上运行某些单元测试的权重相当大。我选择了一种使用原型数据库的解决方法,可以在测试之间快速恢复到原始状态。 Sqlite还提供了一个内存模式,这使得这是一个非常好的选择。我的整个数据库测试套件(测试每个DAO)都在5秒内运行,并且在每次测试之间都会重置数据库。 –