【问题标题】:Execute SQL file from Spring JDBC Template从 Spring JDBC 模板执行 SQL 文件
【发布时间】:2015-08-24 06:53:29
【问题描述】:

我正在尝试编写一些代码来读取 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();

两个(所有)语句都被执行了。当我尝试在 spring JdbcTemplate 中做同样的事情时,只执行了第一条语句!

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

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

【问题讨论】:

    标签: java spring jdbctemplate


    【解决方案1】:

    也许 Spring 的 ScriptUtils 对您的情况有用。尤其是executeSqlScript 方法。

    注意DEFAULT_STATEMENT_SEPARATOR 的默认值为';'(请参阅Constant Field Values

    【讨论】:

    • 它似乎有效。虽然确实删除了 cmets(SQLite 可以将其保留为列的描述),但现在我并不担心。
    • 有什么方法可以使用这个 executeSqlScript() 方法来获取更改的行数?
    • executeSqlScript 现在已弃用。有什么选择吗?
    • @Daniele 通常不推荐使用的方法会在其 JavaDoc 中提示使用什么。但是,即使在最新的ScriptUtils 上,我也看不到任何弃用信息。你在看不同的课程吗?
    • @DarioSeidl 是的。弃用从 Spring Spring 4.0.3 开始,转而使用 springframework.jdbc.datasource.init.ResourceDatabasePopulator
    【解决方案2】:

    我已经通过这种方式解决了这个问题:

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

    你可以照常注入DataSource

    import javax.sql.DataSource;
    //...
    @Autowired
    private DataSource dataSource;
    

    【讨论】:

      【解决方案3】:

      试试看

      public void executeSqlScript(Connection connection,StringBuffer sql)throws SQLException{
               try {
                   connection.setAutoCommit(false);//disable auto commit
                   ScriptUtils.executeSqlScript(connection, new ByteArrayResource(sql.toString().getBytes()));
                   connection.commit();//commit manually 
              } catch (SQLException e) {
                  connection.rollback();
              }finally{
                  connection.close();
              }
           }
      

      【讨论】:

        【解决方案4】:

        我们也可以通过 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();
            }
        }
        

        【讨论】:

          【解决方案5】:

          我正在为我的项目案例寻找类似的选项,然后我偶然发现了以下https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.html

          提供的 Stackoverflow 示例非常简洁,如果您希望 Spring 代表您处理样板 sql 处理 https://stackoverflow.com/a/23036217/1958683

          【讨论】:

            猜你喜欢
            • 2018-08-10
            • 2023-03-15
            • 2012-12-15
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 2010-11-30
            • 2015-04-13
            • 2012-04-23
            相关资源
            最近更新 更多