web-dev-qa-db-ja.com

JDBCとMySQLを使用して.sqlスクリプトを実行する

JDBCで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スクリプトを実行する方法はありますか?

65
Macarse

OK。プロジェクトでこのクラスを使用できます(ファイルの長さのためにPastebinに投稿されます)。ただし、Apacheライセンス情報を保持することを忘れないでください。

JDBC ScriptRunner

依存関係が削除されたiBatis ScriptRunnerのはぎ取りです。

このように使用できます

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

それでおしまい!

70
jitter

私はこれについて多くの研究を行い、良い 春からのユーティリティ を見つけました。 SimpleJdbcTestUtils.executeSqlScript(...)を使用することは、より保守およびテストされているため、実際には最良のソリューションだと思います。

編集:SimpleJdbcTestUtilsは非推奨です。 JdbcTestUtilsを使用する必要があります。リンクを更新しました。

24
Amir Raminfar

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();
    }
15
Abdull

';'で分割された単純なSQLスクリプトの場合この単純な関数を使用できます。コメントを削除し、ステートメントを1つずつ実行します

  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();
    }
  }
6
lunicon

@パンテリス・ソパサキス

GitHubのわずかに変更されたバージョン: https://Gist.github.com/831762/

そこで変更を追跡するのが簡単です。

4
joe776

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 これがあなたの役に立つことを願っています。

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ファイルとDB接続を取得します。次に、Java.ioのBufferedReaderを使用して、ファイルを1行ずつ読み取ります。
そして、最後に、読み取りステートメントを実行します。

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

別の興味深いオプションは、 Jisql を使用してスクリプトを実行することです。ソースコードが利用可能であるため、アプリケーションに埋め込むことができるはずです。


編集:それを注意深く見ました。それを他の何かの中に埋め込むには、そのソースコードに何らかの変更が必要になります。

2
Haroldo_OK

Oracle PL/SQLの場合、Oracle JDBCドライバーは、ストアドプロシージャや匿名ブロック(PL/SQL固有の表記法)を含むSQLスクリプト全体の実行を実際にサポートしています。

JDBCドライバーはPL/SQLストアドプロシージャにアクセスできますか?

Oracle JDBCドライバー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()メソッドにフィードできるようにする必要があります。

1
Gregor

Maven SQLプラグイン このプラグインを使用して、ファイルまたはファイルのリストを介してSQLステートメントを実行します

  1. sqlCommand
  2. srcFiles 3.ファイルセット構成
1
kapil das

コードを書く:

  1. 多数のSQLステートメントを含むファイルを読み取ります。
  2. 各SQLステートメントを実行します。
1
matt b

実際にこれを行う方法はありません。

Runtime.exec(String [])を介してmysqlコマンドラインクライアントを実行し、このオプションを決定するときに この記事 を読むことができます。

または、 ibatis からScriptRunner(com.ibatis.common.jdbc.ScriptRunner)を使用してみてください。しかし、スクリプトを実行するためだけにライブラリ全体を含めるのは少し愚かです。

0
jitter