使用MySQL和JDBC运行.sql脚本

时间:2009-06-25 14:14:24

标签: java sql mysql jdbc

我开始在MySQL中使用MySQL。

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///x", "x", "x");
stmt = conn.createStatement();
stmt.execute( "CREATE TABLE amigos" +
            "("+
            "id          int AUTO_INCREMENT          not null,"+
            "nombre      char(20)                    not null,"+
            "primary key(id)" +
            ")");

我要创建3-4个表,这看起来不太好。

有没有办法从MySQL JDBC运行.sql脚本?

12 个答案:

答案 0 :(得分:70)

确定。您可以在此项目中使用此类(由于文件长度而在pastebin上发布)。但请记住保留apache许可证信息。

JDBC ScriptRunner

iBatis ScriptRunner的ripoff删除了依赖项。

您可以像这样使用

Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));

就是这样!

答案 1 :(得分:24)

我对此进行了大量研究并发现了一个很好的util from spring。我认为使用SimpleJdbcTestUtils.executeSqlScript(...)实际上是最好的解决方案,因为它更加维护和测试。

修改:SimpleJdbcTestUtils已弃用。您应该使用JdbcTestUtils。更新了链接。

答案 2 :(得分:14)

Spring Framework的ResourceDatabasePopulator可能有所帮助。正如您所说的那样,您正在使用MySQL和JDBC,我们假设您已准备好支持MySQL的DataSource实例。此外,假设您的MySQL脚本文件是类路径可定位的。假设您使用的是WAR布局,脚本文件位于目录src/main/webapp/resources/mysql-scripts/...src/test/resources/mysql-scripts/...中。然后你可以使用ResourceDatabasePopulator来执行这样的SQL脚本:

import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;

DataSource dataSource = getYourMySQLDriverBackedDataSource();

ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();    
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/firstScript.sql"));
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/secondScript.sql"));

try {
        Connection connection = dataSource.getConnection();
        rdp.populate(connection); // this starts the script execution, in the order as added
    } catch (SQLException e) {
        e.printStackTrace();
    }

答案 3 :(得分:6)

对于由';'分割的简单sql脚本你可以使用这个简单的功能。 它逐个删除注释和运行语句

  static void executeScript(Connection conn, InputStream in)
    throws SQLException
  {
    Scanner s = new Scanner(in);
    s.useDelimiter("/\\*[\\s\\S]*?\\*/|--[^\\r\\n]*|;");

    Statement st = null;

    try
    {
      st = conn.createStatement();

      while (s.hasNext())
      {
        String line = s.next().trim();

        if (!line.isEmpty())
          st.execute(line);
      }
    }
    finally
    {
      if (st != null)
        st.close();
    }
  }

答案 4 :(得分:4)

@Pantelis Sopasakis

GitHub上的略微修改版本:https://gist.github.com/831762/

更容易跟踪修改。

答案 5 :(得分:2)

关于SQL脚本运行器(我也在使用),我注意到以下代码:

for (int i = 0; i < cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

但是,在getString(int)方法的API文档中,提到了indexes start with 1,所以这应该成为:

for (int i = 1; i <= cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

其次,ScriptRunner的这种实现不支持SQL脚本中的 DELIMITER 语句,如果您需要编译TRIGGERS或PROCEDURES,这些语句很重要。所以我创建了ScriptRunner的这个修改版本:http://pastebin.com/ZrUcDjSx我希望你会发现它有用。

答案 6 :(得分:2)

另一个有趣的选择是使用Jisql来运行脚本。由于源代码可用,因此应该可以将其嵌入到应用程序中。

编辑:仔细看看它;将其嵌入其他内容需要对其源代码进行一些修改。

答案 7 :(得分:2)

你能用这个:

public static void executeSQL(File f, Connection c) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader(f));
    String sql = "", line;
    while ((line = br.readLine()) != null) sql += (line+"\n");
    c.prepareCall(sql).execute(sql);
}

此函数获取SQL文件和数据库连接。 然后它使用来自java.io的BufferedReader逐行读取文件 最后,执行read语句。

Java 8+版本:

public static void executeSQL(Path p, Connection c) throws Exception {
    List<String> lines = Files.readAllLines(p);
    String s = String.join("\n", lines.toArray(new String[0]));
    c.prepareCall(s).execute(s);
}

答案 8 :(得分:1)

将代码写入:

  1. 读入包含许多SQL语句的文件。
  2. 运行每个SQL语句。

答案 9 :(得分:1)

对于Oracle PL / SQL,Oracle JDBC驱动程序确实支持执行整个SQL脚本,包括存储过程和匿名块(PL / SQL特定符号),请参阅

Can the JDBC Drivers access PL/SQL Stored Procedures?

Oracle JDBC driver FAQ有更多信息:

  

Oracle JDBC驱动程序支持执行   PL / SQL存储过程和   匿名块。他们支持两者   SQL92转义语法和Oracle PL / SQL   块语法。以下PL / SQL   调用适用于任何Oracle JDBC   驱动程序:

// SQL92 syntax
CallableStatement cs1 = conn.prepareCall
                       ( "{call proc (?,?)}" ) ; // stored proc
CallableStatement cs2 = conn.prepareCall
                       ( "{? = call func (?,?)}" ) ; // stored func
// Oracle PL/SQL block syntax
CallableStatement cs3 = conn.prepareCall
                       ( "begin proc (?,?); end;" ) ; // stored proc
CallableStatement cs4 = conn.prepareCall
                       ( "begin ? := func(?,?); end;" ) ; // stored func

应该可以读入文件并将内容提供给prepareCall() - 方法。

答案 10 :(得分:1)

Maven SQL Plugin使用此插件通过

执行文件或文件列表的SQL语句
  1. 的SqlCommand
  2. srcFiles 3.fileset配置

答案 11 :(得分:0)

没有办法做到这一点。

您可以通过Runtime.exec(String [])运行mysql命令行客户端,并在决定使用此选项时阅读this article

或尝试使用ibatis中的ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)。但是为了运行脚本而包含整个库有点愚蠢。