如何在Java中执行SQL脚本文件?

Vla*_*mir 36 java sql-scripts

我想用Java执行SQL脚本文件而不将整个文件内容读入大查询并执行它.

还有其他标准方式吗?

Rus*_*ovs 27

只要您不介意依赖Ant,就可以自己从Java执行SQL脚本而无需自己阅读.在我看来,这种依赖在你的情况下非常合理.以下是示例代码,其中SQLExec类位于ant.jar中:

private void executeSql(String sqlFilePath) {
    final class SqlExecuter extends SQLExec {
        public SqlExecuter() {
            Project project = new Project();
            project.init();
            setProject(project);
            setTaskType("sql");
            setTaskName("sql");
        }
    }

    SqlExecuter executer = new SqlExecuter();
    executer.setSrc(new File(sqlFilePath));
    executer.setDriver(args.getDriver());
    executer.setPassword(args.getPwd());
    executer.setUserid(args.getUser());
    executer.setUrl(args.getUrl());
    executer.execute();
}
Run Code Online (Sandbox Code Playgroud)


Pab*_*ruz 20

没有可移植的方法.您可以执行本机客户端作为外部程序来执行此操作:

import java.io.*;
public class CmdExec {

  public static void main(String argv[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec
        ("psql -U username -d dbname -h serverhost -f scripfile.sql");
      BufferedReader input =
        new BufferedReader
          (new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    }
    catch (Exception err) {
      err.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 代码示例从此处提取并修改为回答问题,假设用户想要执行PostgreSQL脚本文件.


Aar*_*lla 6

不,您必须读取文件,将其拆分为单独的查询,然后单独执行(或使用JDBC的批处理API).

其中一个原因是每个数据库都定义了自己分离SQL语句的方式(一些使用;,另一些/,一些允许两者甚至定义自己的分隔符).


Ste*_*hen 6

Flyway库确实非常适合:

    Flyway flyway = new Flyway();
    flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword());
    flyway.setLocations("classpath:db/scripts");
    flyway.clean();
    flyway.migrate();
Run Code Online (Sandbox Code Playgroud)

这将扫描脚本的位置并按顺序运行它们。可以使用V01__name.sql对脚本进行版本控制,因此,如果仅调用迁移,则仅运行尚未运行的脚本。使用称为“ schema_version”的表来跟踪事物。但是也可以做其他事情,请参阅docs:flyway

清理调用不是必需的,但对于从清理数据库开始很有用。另外,请注意位置(默认为“ classpath:db / migration”),在':'后面没有空格,这会引起我的注意。