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スクリプトを実行する方法はありますか?
OK。プロジェクトでこのクラスを使用できます(ファイルの長さのためにPastebinに投稿されます)。ただし、Apacheライセンス情報を保持することを忘れないでください。
依存関係が削除されたiBatis ScriptRunnerのはぎ取りです。
このように使用できます
Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
それでおしまい!
私はこれについて多くの研究を行い、良い 春からのユーティリティ を見つけました。 SimpleJdbcTestUtils.executeSqlScript(...)
を使用することは、より保守およびテストされているため、実際には最良のソリューションだと思います。
編集:SimpleJdbcTestUtils
は非推奨です。 JdbcTestUtils
を使用する必要があります。リンクを更新しました。
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();
}
';'で分割された単純な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();
}
}
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 これがあなたの役に立つことを願っています。
これを使用できますか:
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);
}
別の興味深いオプションは、 Jisql を使用してスクリプトを実行することです。ソースコードが利用可能であるため、アプリケーションに埋め込むことができるはずです。
編集:それを注意深く見ました。それを他の何かの中に埋め込むには、そのソースコードに何らかの変更が必要になります。
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()メソッドにフィードできるようにする必要があります。
Maven SQLプラグイン このプラグインを使用して、ファイルまたはファイルのリストを介してSQLステートメントを実行します
コードを書く: