2015-06-09 84 views
9

我正在嘗試寫一些讀取SQL文件的代碼(由;分隔的多個CREATE TABLE語句)並執行所有語句。從Spring JDBC模板執行SQL文件

在純JDBC,我可以這樣寫:

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

,並得到執行這兩個(全部)的聲明。當我試圖在Spring JdbcTemplate中做同樣的事情時,只有第一條語句被執行!

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

有沒有辦法執行多個語句?雖然使用谷歌搜索,我發現只有像「手動分割sqlQuery ;」這樣的解決方案當然是無用的(它需要更多的解析)。

回答

12

也許春天的ScriptUtils將對你的情況有用。特別是executeSqlScript方法。

注意DEFAULT_STATEMENT_SEPARATOR有​​3210默認值(見Constant Field Values

+1

它似乎工作。雖然可以刪除註釋(SQLite可以保留爲列的描述),但現在並不擔心。 –

+0

有沒有什麼辦法可以通過這個executeSqlScript()方法獲取更改的行數? – zygimantus

+0

executeSqlScript現已被棄用。任何選擇? – Daniele

7

我已經解決了這個樣子:

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

我們還可以通過SQLEXEC achive。下面的代碼正在爲我工​​作。

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

嘗試

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