Ausführen eines SQL-Skripts mit MySQL mit JDBC

Ich fange an, MySQL mit JDBC zu verwenden.

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)" + ")"); 

Ich habe 3-4 Tabellen zu erstellen und das sieht nicht gut aus.

Gibt es eine Möglichkeit, ein .sql-Skript von MySQL JDBC auszuführen?

   

OK. Sie können diese class hier (in Pastebin wegen der Dateilänge) in Ihrem Projekt verwenden. Aber denken Sie daran, die Apache-Lizenzinformationen zu behalten.

JDBC ScriptRunner

Es ist Abzocke des iBatis ScriptRunner mit entfernten Abhängigkeiten.

Du kannst es so benutzen

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

Das ist es!

Ich habe viel darüber recherchiert und im Spring ein gutes Utility gefunden . Ich denke, mit SimpleJdbcTestUtils.executeSqlScript(...) ist eigentlich die beste Lösung, da es mehr gewartet und getestet wird.

Bearbeiten: SimpleJdbcTestUtils ist veraltet. Sie sollten JdbcTestUtils . Der Link wurde aktualisiert.

Spring ResourceDatabasePopulator kann helfen. Wie Sie sagten, verwenden Sie MySQL und JDBC, nehmen wir an, Sie haben eine MySQL-unterstützte DataSource Instanz bereit. Angenommen, Ihre MySQL-Skriptdateien sind classnpfad-lokalisierbar. Angenommen, Sie verwenden das WAR-Layout und die Skriptdateien befinden sich in einem Verzeichnis src/main/webapp/resources/mysql-scripts/... oder src/test/resources/mysql-scripts/... Dann können Sie mit ResourceDatabasePopulator SQL-Skripte wie ResourceDatabasePopulator ausführen:

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

Für einfaches SQL-Skript, aufgeteilt nach ‘;’ Sie können diese einfache function verwenden. Es entfernt Kommentare und führt statementen einzeln aus

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

@ Pantelis Sopasakis

Leicht modifizierte Version auf GitHub: https://gist.github.com/831762/

Es ist einfacher, Änderungen dort zu verfolgen.

In Bezug auf den SQL-Skript-Runner (den ich auch verwende) habe ich folgenden Codeabschnitt bemerkt:

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

In der API-Dokumentation für die Methode getString (int) wird jedoch erwähnt, dass Indizes mit 1 beginnen.

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

Zweitens bietet diese Implementierung von ScriptRunner keine Unterstützung für DELIMITER- statementen im SQL-Skript, die wichtig sind, wenn Sie TRIGGERS oder PROCEDURES kompilieren müssen. Also habe ich diese modifizierte Version von ScriptRunner erstellt: http://pastebin.com/ZrUcDjSx, die Sie hoffentlich nützlich finden werden.

Eine weitere interessante Option wäre die Verwendung von Jisql zum Ausführen der Skripts. Da der Quellcode verfügbar ist, sollte es möglich sein, ihn in eine Anwendung einzubetten.


Edit: Habe genau hingesehen; Einbetten in etwas anderes würde einige Änderungen an seinem Quellcode erfordern.

Schreibe Code zu:

  1. Lies eine Datei ein, die eine Anzahl von SQL-statementen enthält.
  2. Führen Sie jede SQL-statement aus.

Für Oracle PL / SQL unterstützt der Oracle JDBC-Treiber die Ausführung kompletter SQL-Skripte einschließlich gespeicherter Prozeduren und anonymer Blöcke (PL / SQL-spezifische Notation), siehe

Können die JDBC-Treiber auf gespeicherte PL / SQL-Prozeduren zugreifen?

Die Oracle JDBC-Treiber-FAQ enthält weitere Informationen:

Oracle JDBC-Treiber unterstützen die Ausführung von gespeicherten PL / SQL-Prozeduren und anonymen Blöcken. Sie unterstützen sowohl die SQL92-Escape-Syntax als auch die Oracle PL / SQL-Block-Syntax. Die folgenden PL / SQL-Aufrufe funktionieren mit jedem Oracle JDBC-Treiber:

 // 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 

Es sollte möglich sein, eine Datei einzulesen und den Inhalt der prepareCall () – Methode zuzuführen.

Maven SQL Plugin Verwenden Sie dieses Plugin, um SQL-statementen über eine Datei oder eine Liste von Dateien auszuführen

  1. sqlCommand
  2. srcFiles 3.fileset-Konfigurationen

Können Sie diese benutzen:

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

Es gibt nicht wirklich einen Weg, dies zu tun.

Sie könnten entweder den mysql-Befehlszeilen-Client über Runtime.exec (String []) ausführen und diesen Artikel lesen, wenn Sie sich für diese Option entscheiden

Oder versuchen Sie es mit dem ScriptRunner (com.ibatis.common.jdbc.ScriptRunner) von ibatis . Aber es ist ein bisschen dumm, eine ganze Bibliothek einzuschließen, nur um ein Skript auszuführen.