2015-06-09 13 views
9

Próbuję napisać trochę kodu, który odczytuje plik SQL (wiele instrukcji CREATE TABLE rozdzielonych przez ;) i wykonuje wszystkie instrukcje.Wykonaj plik SQL ze Spring JDBC Template

w czystej JDBC, mogę napisać:

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

i oba (wszystkie) oświadczenia został wykonany. Kiedy próbowałem zrobić to samo na wiosnę JdbcTemplate, wykonywana jest tylko pierwsza instrukcja!

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

Czy istnieje sposób wykonywania wielu instrukcji? Podczas googlowania znalazłem tylko rozwiązania takie jak "podzielenie sqlQuery przez ; ręcznie", co oczywiście jest bezużyteczne (wymagałoby znacznie więcej analiz).

Odpowiedz

12

Może przyda się wiosna ScriptUtils. Zwłaszcza metody executeSqlScript.

Zauważ, że DEFAULT_STATEMENT_SEPARATOR ma wartość domyślną ';' (patrz Constant Field Values)

+1

wydaje się działać. Czy usuwa komentarze (które SQLite może zachować jako opis kolumn), ale to nie martwi mnie tak bardzo. –

+0

Czy istnieją sposoby na zmianę liczby wierszy za pomocą tej metody executeSqlScript()? – zygimantus

+0

executeSqlScript są teraz przestarzałe. Jakaś alternatywa? – Daniele

7

mam rozwiązać problem w ten sposób:

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

Możemy również achive przez SQLExec. Poniższy kod działa dla mnie.

import 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

spróbować

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(); 
     } 
    } 
Powiązane problemy