运行使用MySQL使用JDBC一个.SQL脚本运行使用MySQL使用JDBC一个.SQL脚本(Run

2019-05-13 19:38发布

我开始使用MySQL使用JDBC。

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的脚本?

Answer 1:

好。 你可以在你的项目中使用此这个类(上发布引擎收录,因为文件的长度)。 但记得要保持Apache许可证信息。

JDBC ScriptRunner

这是去除依赖iBatis的ScriptRunner的骗人货。

您可以使用它像这样

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

而已!



Answer 2:

我做了很多的研究,发现这个一个很好的从春天UTIL 。 我想用SimpleJdbcTestUtils.executeSqlScript(...)实际上是最好的解决方案,因为它是更多的维护和测试。

编辑: SimpleJdbcTestUtils已被弃用。 您应该使用JdbcTestUtils 。 更新的链接。



Answer 3:

Spring的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();
    }


Answer 4:

对于由分裂简单的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();
    }
  }


Answer 5:

@Pantelis Sopasakis

在GitHub上稍作修改的版本: https://gist.github.com/831762/

它更容易出现跟踪修改。



Answer 6:

对于SQL脚本运行(这我还使用),我发现下面的代码:

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

然而,对于该方法的getString(int)的API文档中它提到, 指数从1开始 ,所以这应该成为:

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

二,本次实施ScriptRunner不提供对SQL脚本DELIMITER语句,如果你需要编译触发器或程序,这是很重要的支持。 所以我创建ScriptRunner的这款改装版: http://pastebin.com/ZrUcDjSx ,我希望你能找到有用的。



Answer 7:

另一个有趣的选项是使用Jisql运行的脚本。 由于源代码是可用的,它应该有可能将其嵌入到应用程序。


编辑:花了仔细的看看吧; 嵌入这里面别的东西需要一些修改其源代码。



Answer 8:

你可以这样做:

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文件和数据库连接。 然后,它读取使用的BufferedReader从java.io.文件中的行由行
最后,执行所读语句。

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);
}


Answer 9:

编写代码:

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


Answer 10:

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

在JDBC驱动程序可以访问PL / SQL存储过程?

在Oracle JDBC驱动程序常见问题有更多的信息:

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() - 方法。



Answer 11:

Maven的SQL插件使用这个插件通过执行SQL语句的文件的文件或目录

  1. 的SqlCommand
  2. srcFiles 3.fileset配置


Answer 12:

是不是真的有办法做到这一点。

您既可以通过运行在的Runtime.exec mysql命令行客户端(字符串[]),并阅读这篇文章 ,当你决定了这个选项

或尝试使用ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)从ibatis的 。 但它是一个有点傻,包括整个图书馆只运行一个脚本。



文章来源: Running a .sql script using MySQL with JDBC