使用 JDBC 执行 .sql 文件
Posted
技术标签:
【中文标题】使用 JDBC 执行 .sql 文件【英文标题】:Execute .sql files using JDBC 【发布时间】:2016-08-13 20:36:08 【问题描述】:我想测试一个使用 SQLite JDBC 驱动程序的手写 DAO。我的计划是将版本控制中的模式和数据插入保留为 .sql 文件,并在测试之前执行它们以获得可用于测试的填充数据库。
在寻找使用 JDBC 执行整个 sql 脚本的解决方案时,发现一堆 *** 线程说这是不可能的,并提供了一些解析脚本,将 sql 脚本拆分为单独的 sql 语句 (SQLScriptRunner)。
这些帖子大多是 3 年以上的,所以我想知道是否仍然没有“简单”的方法来使用 JDBC API 执行 sql 脚本。
我在问,因为 SQLite 为我提供了从现有数据库克隆数据库的选项,我更喜欢使用大型 Script-Executer 实现(执行器可能比我所有的数据访问代码加起来还要大) .
那么,是否有一种开箱即用的简单方法来使用 JDBC 执行 sql 脚本,还是只能使用一些解析脚本?
【问题讨论】:
【参考方案1】:我猜 Spring Framework 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 包装器的情况下使用它有点棘手。
其中一些包装器:
Spring Test DbUnit https://springtestdbunit.github.io/spring-test-dbunit/
Unitils DbUnit http://www.unitils.org/tutorial-database.html
【讨论】:
我看到其他文章中经常提到 DbUnit,如果我将来有更多需要测试的数据库代码,我可能会使用它。 Spring 看起来非常好,但 Spring 对 ScriptLoader 来说是一个非常大的依赖项。将来我可能会重构我的应用程序以使用更大的框架 - 如果是 Spring,我会使用它! Spring Framework 是高度模块化的项目。该类位于 spring-jdbc 模块内,该模块还包含许多对 jdbc 代码有用的类。 JdbcTemplate 和 NamedParameterJdbcTemplate 只是很棒的类,你肯定应该在你的 DAO 类中使用它们。它们处理关闭/打开连接,提供许多有用的方法,例如 queryForObject、queryForList,并且通常使编写 jdbc 代码更加愉快。你真的应该考虑使用它! 不知道分得这么好,谢谢你提到!【参考方案2】:虽然不是“开箱即用”的 JDBC 解决方案,但我倾向于使用 SqlTool。它对 HSQLDB 特别友好,但它可以与(几乎?)任何 JDBC 驱动程序一起使用。 (文档显示了如何连接 PostgreSQL、SQL Server、Oracle、Derby 等的示例。)它可以通过Maven 获得,JAR 文件只有 ~150KB。有关如何使用它运行 SQL 脚本的示例,请参阅我的另一个答案 here。
根据您问题中的评论提出的 Spring“ScriptUtils”解决方案...
我更喜欢 [其他一些解决方案] 而不是使用大型 Script-Executer 实现(执行器可能比我所有的数据访问代码加起来还要大)。
...请注意,spring-jdbc
的依赖项包括 spring-core
、spring-beans
、spring-tx
和 commons-logging-1.2
,总计约 2.5MB。这比 SqlTool JAR 文件大 15 倍以上,而且它甚至不包括任何额外的 DbUnit“包装器”,这些包装器可能需要也可能不需要使 ScriptUtils 更易于使用。
【讨论】:
所有解决方案(包括 SqlTools)都不是我想要的。 DbUnit 与 spring-jdbc 结合可能会解决我所有的问题,但是仅在 sqlite 数据库上运行一些单元测试是相当沉重的。我选择了一个使用原型数据库的解决方法,我可以在测试之间快速恢复到其原始状态。 Sqlite 还提供了内存模式,这使它成为一个非常好的选择。我的整个数据库测试套件(测试我拥有的每个 DAO)在 5 秒内运行,并且每次测试之间都会重置数据库。以上是关于使用 JDBC 执行 .sql 文件的主要内容,如果未能解决你的问题,请参考以下文章
去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本
JDBC——PreparedStatement执行SQL的对象