从Spring JDBC Template执行SQL文件

Ond*_*cka 17 java spring jdbctemplate

我正在尝试编写一些读取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();
Run Code Online (Sandbox Code Playgroud)

并且两个(所有)语句都已执行.当我尝试在Spring JdbcTemplate中执行相同操作时,只执行第一个语句!

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

有没有办法执行多个语句?在谷歌搜索时,我发现只有" ;手动拆分sqlQuery "这样的解决方案当然没用(它需要更多的解析).

sip*_*uel 17

也许Spring的ScriptUtils对你的情况很有用.特别是executeSqlScript方法.

请注意,DEFAULT_STATEMENT_SEPARATOR其默认值为';'(请参阅常量字段值)


Ana*_*iuk 14

我用这种方式解决了这个问题:

    public void createDefaultDB(DataSource dataSource) {
    Resource resource = new ClassPathResource("CreateDefaultDB.sql");
    ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource);
    databasePopulator.execute(dataSource);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

试试吧

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();
        }
     }
Run Code Online (Sandbox Code Playgroud)