在JDBC连接上运行SQL脚本,最小方法
长话短说:我想在HSQLDB数据库上运行SQL脚本 我想遵循一种极简主义的方法,这意味着:在JDBC连接上运行SQL脚本,最小方法,jdbc,hsqldb,Jdbc,Hsqldb,长话短说:我想在HSQLDB数据库上运行SQL脚本 我想遵循一种极简主义的方法,这意味着: 绝对不需要手动解析SQL 除通用工具外,没有其他依赖项。我在这里进行区分是因为,例如,我拒绝引入Ibatis或Hibernate,它们是范围更大的框架,但我会接受ApacheCommons或guava类型的utils库 该库必须在MAVEN上可用。没有小时间宠物项目的东西 (编辑12/5/15)必须能够从类路径执行SQL文件 给你一些背景: try { connection =
- 绝对不需要手动解析SQL
- 除通用工具外,没有其他依赖项。我在这里进行区分是因为,例如,我拒绝引入Ibatis或Hibernate,它们是范围更大的框架,但我会接受ApacheCommons或guava类型的utils库
- 该库必须在MAVEN上可用。没有小时间宠物项目的东西
- (编辑12/5/15)必须能够从类路径执行SQL文件
try {
connection = DriverManager.getConnection("jdbc:hsqldb:file:mydb", "sa", "");
// Run script here
} catch (SQLException e) {
throw new RuntimeException("Unable to load database", e);
}
一艘邮轮就好了。比如:
FancyUtils.runScript(connection, new File("myFile.sql"));
我确实找到了,但它以数据库对象作为参数,我似乎不知道如何获取实例。另外,我不喜欢“恢复数据库状态”的描述,那么这是否意味着我的数据库将首先被清除?这绝对不是我想要的。我只是尝试在中使用
SqlFile
对象,它对我有效。我使用的Maven依赖是
org.hsqldb
还要注意,这种方法并不局限于HSQLDB数据库。它也可以用于其他数据库(例如MySQL、SQL Server)。这使用了SqlTool库,但通过使用SqlFile
类直接从类路径读取脚本:
try(InputStream inputStream = getClass().getResourceAsStream("/script.sql")) {
SqlFile sqlFile = new SqlFile(new InputStreamReader(inputStream), "init", System.out, "UTF-8", false, new File("."));
sqlFile.setConnection(connection);
sqlFile.execute();
}
尽管OP提到iBatis是非必需的,但我仍然想推荐MyBatis——最初的创作者所设计的iBatis分叉
核心库(org.mybatis:mybatis
)不需要依赖项(它的所有依赖项都是可选的),虽然比HSQLDB SqlTool大,但它的二进制容量为1.7MB,对于大多数用途来说并不太大,并且可以持续维护(截至本文撰写之时,上一个版本3.5是上个月发布的)
您可以使用JDBC连接初始化ScriptRunner
,然后调用runScript(新的InputStreamReader(sqlinputst,Standard chartered.UTF_8))
来运行任何可以获得输入流的SQL脚本。我不喜欢这样的事实,即基本上使用CLI作为utils API,但它确实解决了问题,而且似乎是总体上最好的解决方案。最后,我用Java编写sql语句列表,而不是编写脚本,因为我太忙了。但我相信答案是有效的。最后我开始使用它,但有一个主要问题——这个解决方案无法从类路径运行文件,因此我无法将我的模式与源代码捆绑在一起。这对我来说是一个破坏者。假设java进程可以访问文件系统是危险的。如果没有必要,最好避免这种依赖关系。据我所知,Mybatis不允许您简单地从类路径运行sql脚本。相反,您需要将sql放入一个格式正确的xml文件中,并设置用于读取xml的样板代码。