Esecuzione di uno script .sql usando MySQL con JDBC

Sto iniziando a utilizzare MySQL con 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)" + ")"); 

Ho 3-4 tavoli da creare e questo non sembra buono.

C’è un modo per eseguire uno script .sql da MySQL JDBC?

Ok. Puoi usare questa class qui (pubblicata su pastebin a causa della lunghezza del file) nel tuo progetto. Ma ricorda di mantenere le informazioni sulla licenza di apache.

JDBC ScriptRunner

È la ripoff di iBatis ScriptRunner con le dipendenze rimosse.

Puoi usarlo in questo modo

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

Questo è tutto!

Ho fatto molte ricerche su questo e ho trovato un buon util da spring . Penso che l’uso di SimpleJdbcTestUtils.executeSqlScript(...) sia in realtà la soluzione migliore, poiché è più gestita e testata.

Modifica: SimpleJdbcTestUtils è deprecato. Dovresti usare JdbcTestUtils . Aggiornato il link.

ResourceDatabasePopulator Spring Framework può aiutare. Come hai detto che stai usando MySQL e JDBC, supponiamo tu abbia un’istanza DataSource supportata da MySQL pronta. Inoltre, supponiamo che i tuoi file di script MySQL siano localpath-localizzabili. Supponiamo che tu stia utilizzando il layout di WAR e che i file di script si trovino in una directory src/main/webapp/resources/mysql-scripts/... o src/test/resources/mysql-scripts/... Quindi è ansible utilizzare ResourceDatabasePopulator per eseguire script SQL come questo:

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

Per il semplice script sql diviso da ‘;’ puoi usare questa semplice funzione. Rimuove i commenti ed esegue le istruzioni una per una

  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

Versione leggermente modificata su GitHub: https://gist.github.com/831762/

È più facile tracciare le modifiche lì.

Riguardo al runner di script SQL (che sto usando anche io), ho notato la seguente parte di codice:

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

Tuttavia, nella documentazione API per il metodo getString (int) viene menzionato che gli indici iniziano con 1 , quindi questo dovrebbe diventare:

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

In secondo luogo, questa implementazione di ScriptRunner non fornisce supporto per le istruzioni DELIMITER nello script SQL che sono importanti se è necessario compilare TRIGGERS o PROCEDURES. Così ho creato questa versione modificata di ScriptRunner: http://pastebin.com/ZrUcDjSx che spero che troverai utile.

Un’altra opzione interessante sarebbe usare Jisql per eseguire gli script. Poiché il codice sorgente è disponibile, dovrebbe essere ansible incorporarlo in un’applicazione.


Modifica: guardò attentamente; incorporarlo in qualcos’altro richiederebbe qualche modifica al suo codice sorgente.

Scrivi il codice a:

  1. Leggi in un file contenente un numero di istruzioni SQL.
  2. Esegui ogni istruzione SQL.

Per Oracle PL / SQL, il driver JDBC Oracle supporta effettivamente l’esecuzione di interi script SQL, tra cui stored procedure e blocchi anonimi (notazione specifica PL / SQL), vedere

I driver JDBC possono accedere alle stored procedure PL / SQL?

Le FAQ del driver JDBC Oracle hanno più informazioni:

I driver JDBC Oracle supportano l’esecuzione di procedure memorizzate PL / SQL e blocchi anonimi. Supportano sia la syntax di escape SQL92 che la syntax del blocco Oracle PL / SQL. Le seguenti chiamate PL / SQL potrebbero funzionare con qualsiasi driver JDBC Oracle:

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

Dovrebbe essere ansible leggere in un file e inserire il contenuto nel metodo prepareCall ().

Maven SQL Plugin Usa questo plugin per eseguire istruzioni SQL tramite un file o un elenco di file

  1. sqlCommand
  2. srcFiles 3. configurazioni del file

Puoi usare questo:

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

Non c’è davvero un modo per farlo.

È ansible eseguire il client della riga di comando mysql tramite Runtime.exec (String []) e leggere questo articolo quando si decide per questa opzione

Oppure prova a utilizzare ScriptRunner (com.ibatis.common.jdbc.ScriptRunner) da ibatis . Ma è un po ‘stupido includere un’intera libreria solo per eseguire uno script.