通过Java执行.sql文件

时间:2011-04-27 09:17:59

标签: java sql

我有一个sql脚本文件,我需要通过java执行存在的命令。我在互联网上搜索了相同的内容,我得到了一些定义解析器的代码来拆分SQL语句并执行它。但是它们都没有为我的sql脚本文件工作。因为我的脚本文件包含最后没有分号的create语句和alter语句[相反它有GO]任何人都可以建议执行脚本文件的解决方案吗? 谢谢, 马赫什

7 个答案:

答案 0 :(得分:1)

对于简单的脚本,我通常使用ibatis中的这个类 - ScriptRunner。另外,您可以从Java生成新的数据库客户端进程并输入您不会执行的脚本。这适用于所有脚本,因为当例如更改sql文件中的分隔符时,像ScriptRunner这样的简单解决方案不能很好地工作。

以下是如何将sql作为字符串提供给spawed数据库客户端进程的示例:

private void runSql(String pSql) {
        String tCommand = "mysql -u " + username + (password != null ? " -p" + password : "") + " " + dbName;
        System.out.println(tCommand);

        try {
            Process tProcess = Runtime.getRuntime().exec(tCommand);
            OutputStream tOutputStream = tProcess.getOutputStream();
            Writer w = new OutputStreamWriter(tOutputStream);
            System.out.println(pSql);
            w.write(pSql);
            w.flush();

            Scanner in = new Scanner(tProcess.getErrorStream());

            String errorMessage = "";

            while (in.hasNext()) {
                errorMessage += in.next() + " ";
            }

            if (errorMessage.length() > 0) {
                System.out.println(errorMessage);
                throw new ClientSqlExecutionException(errorMessage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

答案 1 :(得分:0)

查看Mybatis Migrations代码,它会执行您需要的代码:

http://code.google.com/p/mybatis/wiki/Migration

答案 2 :(得分:0)

您需要更改解析器,以便生成可执行语句。但是,当你说“通过Java执行”时,我不确定我理解你的意思。

Java将不会执行这些SQL语句 - 您连接的数据库将会执行。 Java可以使用JDBC连接到数据库,并从文件中发送SQL语句。

我不明白为什么你必须解析SQL,除非你希望Java在将它们发送到数据库服务器之前验证它们。服务器将再次解析并验证它们,所以感觉就像你正在做额外的工作。

答案 3 :(得分:0)

我能告诉你的最简单的解决方案就是这个,假设我理解你的问题。

1)通过Java IO将文本文件读入字符串或数组。 2)通过JDBC将字符串或数组传递给MySQL。

从文件示例中读取

import java.io.*;
class FileRead 
{
   public static void main(String args[])
  {
      try{
    // Open the file that is the first 
    // command line parameter
    FileInputStream fstream = new FileInputStream("textfile.txt");
    // Get the object of DataInputStream
    DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    //Read File Line By Line
    while ((strLine = br.readLine()) != null)   {
      // Print the content on the console
      System.out.println (strLine);
    }
    //Close the input stream
    in.close();
    }catch (Exception e){//Catch exception if any
      System.err.println("Error: " + e.getMessage());
    }
  }
}

获自http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml

答案 4 :(得分:0)

最简单的方法是简单地获取语句并检查它们是否需要它们在末尾是半列:(这是一个示例,只有当它是逐行语句时才有效:

 public void executeScript(String script) {
   BufferedReader in  = new BufferedReader(new FileReader(script));
   while (in.read() > 0) {
     String statement = in.readLine();
     statement = statement.trim().toLowerCase();
     String command = statement.split("[ ]+")[0]; // split the statement.

     if (command.equals("insert") || command.equals("update") /* || any other */) {
       statement = statement + ";";
     } 

     // execute statement using jdbc
   }
}

如果您不知道如何使用jdbc,请问: - )

答案 5 :(得分:0)

使用完全自包含的slightly modified version of the com.ibatis.common.jdbc.ScriptRunner class,即您不需要任何第三方jar依赖项。

可以将分隔符从;更改为GO。我认为应该这样做。

以下是一个例子:

        Reader reader = new BufferedReader(*** Your FileReader instance ***);
        try
        {
            ScriptRunner runner = new ScriptRunner(connection, false, true);
            runner.setDelimiter("GO", true);
            runner.runScript(reader);
        }
        finally
        {
            reader.close();
        }

答案 6 :(得分:0)

Apache Ant SQL Task为我工作。 https://ant.apache.org/manual/Tasks/sql.html