2015-06-09 14 views
9

Sto provando a scrivere un po 'di codice che legge un file SQL (più istruzioni CREATE TABLE separate da ;) ed esegue tutte le istruzioni.Esegui file SQL da Spring JDBC Template

In puro JDBC, potrei scrivere:

String sqlQuery = "CREATE TABLE A (...); CREATE TABLE B (...);" 
java.sql.Connection connection = ...; 
Statement statement = connection.createStatement(); 
statement.executeUpdate(sqlQuery); 
statement.close(); 

ed entrambe (tutte) le dichiarazioni ottenuto eseguito. Quando ho provato a fare lo stesso in primavera JdbcTemplate, solo la prima istruzione viene eseguita però!

String sqlQuery = "CREATE TABLE A (...); CREATE TABLE B (...);" 
org.springframework.jdbc.core.JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
jdbcTemplate.execute(sqlQuery); 

Esiste un modo per eseguire più istruzioni? Mentre su Google ho trovato solo soluzioni come "dividere manualmente sqlQuery per ;" che ovviamente è inutile (richiederebbe molto più analisi).

risposta

12

Forse Primavera ScriptUtils saranno utili nel vostro caso. Soprattutto i metodi executeSqlScript.

Nota che DEFAULT_STATEMENT_SEPARATOR ha un valore predefinito di ';' (vedi Constant Field Values)

+1

sembra funzionare. Rimuove i commenti (che SQLite può conservare come descrizione per le colonne), ma questo non mi preoccupa più di tanto. –

+0

Esistono modi per ottenere il numero di righe modificate utilizzando questo metodo executeSqlScript()? – zygimantus

+0

executeSqlScript sono ora deprecati. Qualche alternativa? – Daniele

7

Ho risolto la questione in questo modo:

public void createDefaultDB(DataSource dataSource) { 
    Resource resource = new ClassPathResource("CreateDefaultDB.sql"); 
    ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource); 
    databasePopulator.execute(dataSource); 
} 
0

Possiamo anche achive attraverso SQLExec. Sotto il codice funziona per me.

importazione java.io.File;

import org.apache.tools.ant.Project; 
import org.apache.tools.ant.taskdefs.SQLExec; 

public class Test { 

    public static void main(String[] args) { 
     Test t = new Test(); 
     t.executeSql(""); 
    } 

    private void executeSql(String sqlFilePath) { 
     final class SqlExecuter extends SQLExec { 
      public SqlExecuter() { 
       Project project = new Project(); 
       project.init(); 
       setProject(project); 
       setTaskType("sql"); 
       setTaskName("sql"); 
      } 
     } 

     SqlExecuter executer = new SqlExecuter(); 
     executer.setSrc(new File("test1.sql")); 
     executer.setDriver("org.postgresql.Driver"); 
     executer.setPassword("postgres"); 
     executer.setUserid("postgres"); 
     executer.setUrl("jdbc:postgresql://localhost/test"); 
     executer.execute(); 
    } 
} 
2

provarlo

public void executeSqlScript(Connection connection,StringBuffer sql)throws SQLException{ 
     try { 
      connection.setAutoCommit(false);//设置为手工提交模式 
      ScriptUtils.executeSqlScript(connection, new ByteArrayResource(sql.toString().getBytes())); 
      connection.commit();//提交事务 
     } catch (SQLException e) { 
      connection.rollback(); 
     }finally{ 
      connection.close(); 
     } 
    }