在JDBC连接上运行SQL脚本,最小方法

在JDBC连接上运行SQL脚本,最小方法,jdbc,hsqldb,Jdbc,Hsqldb,长话短说:我想在HSQLDB数据库上运行SQL脚本 我想遵循一种极简主义的方法,这意味着: 绝对不需要手动解析SQL 除通用工具外,没有其他依赖项。我在这里进行区分是因为,例如,我拒绝引入Ibatis或Hibernate,它们是范围更大的框架,但我会接受ApacheCommons或guava类型的utils库 该库必须在MAVEN上可用。没有小时间宠物项目的东西 (编辑12/5/15)必须能够从类路径执行SQL文件 给你一些背景: try { connection =

长话短说:我想在HSQLDB数据库上运行SQL脚本

我想遵循一种极简主义的方法,这意味着:

  • 绝对不需要手动解析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的样板代码。