2015-06-09 5 views
9

से SQL फ़ाइल निष्पादित करें मैं एक SQL फ़ाइल (एकाधिक CREATE TABLE बयान ; से अलग बयान) पढ़ता हूं और सभी कथन निष्पादित करता है।स्प्रिंग जेडीबीसी टेम्पलेट

शुद्ध JDBC में, मैं लिख सकते हैं:

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

और दोनों (सभी) बयान निष्पादित कर ली। जब मैंने वसंत 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';' का डिफ़ॉल्ट मान है (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 के माध्यम से हासिल कर सकते हैं। नीचे कोड मेरे लिए काम कर रहा है।

आयात 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(); 
     } 
    } 
संबंधित मुद्दे