2015-06-09 42 views
9

Tôi đang cố gắng viết một đoạn mã đọc một tệp SQL (nhiều câu lệnh CREATE TABLE được phân tách bằng ;) và thực thi tất cả các câu lệnh.Thực thi tệp SQL từ Spring JDBC Template

Trong JDBC tinh khiết, tôi có thể viết:

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

và cả (tất cả) các báo cáo đã thực hiện. Khi tôi cố gắng làm tương tự trong Spring JdbcTemplate, chỉ có câu lệnh đầu tiên được thực hiện mặc dù!

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

Có cách nào để thực hiện nhiều câu lệnh không? Trong khi googling tôi chỉ tìm thấy các giải pháp như "tách sqlQuery bởi ; bằng tay" mà tất nhiên là vô ích (nó sẽ đòi hỏi phân tích cú pháp nhiều hơn nữa).

Trả lời

12

lẽ Spring ScriptUtils sẽ hữu ích trong trường hợp của bạn. Đặc biệt là phương pháp executeSqlScript.

Lưu ý rằng DEFAULT_STATEMENT_SEPARATOR có một giá trị mặc định của ';' (xem Constant Field Values)

+1

có vẻ như để làm việc. Mặc dù không xóa nhận xét (mà SQLite có thể giữ làm mô tả cho các cột), nhưng điều đó không làm tôi lo lắng nhiều đến thế. –

+0

Có cách nào để thay đổi số hàng bằng phương thức executeSqlScript() này không? – zygimantus

+0

executeSqlScript hiện không được chấp nhận. Bất kỳ thay thế nào? – Daniele

7

Tôi đã giải quyết vấn đề theo cách này:

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

Chúng tôi cũng có thể đạt được thông qua SQLExec. Mã dưới đây đang hoạt động cho tôi.

java.io.File nhập khẩu;

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

thử nó

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(); 
     } 
    } 
Các vấn đề liên quan