2015-06-09 7 views
9

Ich versuche, ein wenig Code zu schreiben, der eine SQL-Datei (mehrere CREATE TABLE Anweisungen getrennt durch ;) liest und alle Anweisungen ausführt.SQL-Datei von Spring JDBC-Vorlage ausführen

In reiner JDBC, konnte ich schreiben:

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

und beide (alle) bekamen die Anweisungen ausgeführt. Wenn ich im Frühling JdbcTemplate das gleiche mache, wird nur die erste Anweisung ausgeführt!

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

Gibt es eine Möglichkeit, mehrere Anweisungen auszuführen? Beim googlen fand ich nur Lösungen wie "split sqlQuery by ; manuell" was natürlich nutzlos ist (es würde viel mehr Parsing erfordern).

Antwort

12

Vielleicht wird die ScriptUtils von Spring in Ihrem Fall nützlich sein. Insbesondere executeSqlScript Methoden.

Beachten Sie, dass DEFAULT_STATEMENT_SEPARATOR einen Standardwert von ';' hat (siehe Constant Field Values)

+1

es scheint zu funktionieren. Entfernt zwar Kommentare (welche SQLite als Beschreibung für Spalten behalten kann), aber das beunruhigt mich jetzt nicht so sehr. –

+0

Gibt es Möglichkeiten, die Anzahl der Zeilen mit dieser executeSqlScript() -Methode zu ändern? – zygimantus

+0

executeSqlScript sind jetzt veraltet. Irgendwelche Alternative? – Daniele

7

ich das Problem auf diese Weise gelöst haben:

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

Wir auch durch SQLExec achive können. Der folgende Code funktioniert für mich.

importieren 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

versuchen es

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