【问题标题】:Running SQL files scripts from a Java program从 Java 程序运行 SQL 文件脚本
【发布时间】:2013-01-04 02:20:37
【问题描述】:

我有一组用于转换原始数据集的 SQL 文件。目前,我打开每个文件并执行它。如何在 Java 程序中执行每个文件?目标是使这个过程更加自动化。

我想做SqlScript.execute("myScript.sql");之类的事情

注意这些 SQL 脚本作用于一个数据库。我想我必须传递某种连接字符串。我正在使用 MySQL。

  1. 我需要哪些对象、库、包等...在 Java 中执行此操作?

【问题讨论】:

标签: java mysql sql jdbc


【解决方案1】:

您可以尝试以下方法:http://www.tonyspencer.com/2005/01/20/execute-mysql-script-from-java/

public static String executeScript (String dbname, String dbuser,
        String dbpassword, String scriptpath, boolean verbose) {
    String output = null;
    try {
        String[] cmd = new String[]{"mysql",
            dbname,
            "--user=" + dbuser,
            "--password=" + dbpassword,
            "-e",
            "\"source " + scriptpath + "\""
            };
        System.err.println(cmd[0] + " " + cmd[1] + " " +
        cmd[2] + " " + cmd[3] + " " +
        cmd[4] + " " + cmd[5]);
        Process proc = Runtime.getRuntime().exec(cmd);
        if (verbose) {
            InputStream inputstream = proc.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            // read the output
            String line;
            while ((line = bufferedreader.readLine()) != null) {
                System.out.println(line);
            }

            // check for failure
            try {
                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " +
                    proc.exitValue());
                }
            }
            catch (InterruptedException e) {
                System.err.println(e);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return output;
}

【讨论】:

  • 我正在尝试这个并在 Windows 中工作正常,但在 linux 中总是以退出代码 1 结束,它与 linux 兼容吗?
【解决方案2】:

Ibatis 提供了一个ScriptRunner 可以帮助你。简单代码sn-ps你可以参考:

Connection conn=getConnection();//some method to get a Connection
ScriptRunner runner=new ScriptRunner(conn, false, false);
InputStreamReader reader = new InputStreamReader(new FileInputStream("foo.sql"));
runner.runScript(reader);
reader.close();
conn.close();

【讨论】:

【解决方案3】:

使用 iBatics 会更容易。

http://repo1.maven.org/maven2/org/mybatis/mybatis/3.2.3/mybatis-3.2.3.jar

此外,您还需要MySQL java driver:com.mysql.jdbc.Driver,可以在 mysql 站点中找到。

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.DriverManager;

import org.apache.ibatis.jdbc.ScriptRunner;

public class Main {
    public static void main(String[] args) {

        String script = "scriptname.sql";
        try {
            Class.forName("com.mysql.jdbc.Driver");
            new ScriptRunner(DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mysql", "root", "root`"))
                    .runScript(new BufferedReader(new FileReader(script)));
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

【讨论】:

  • 感谢您指出这一点。使用 MyBatis 非常重要,因为 iBATIS 已在 Apache Software 基金会退役。我用 MyBatis 3.2.6 试了一下,效果很好。 :-)
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多