Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从SpringJDBC模板执行SQL文件_Java_Spring_Jdbctemplate - Fatal编程技术网

Java 从SpringJDBC模板执行SQL文件

Java 从SpringJDBC模板执行SQL文件,java,spring,jdbctemplate,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(sqlQu

我正在尝试编写一段代码,读取一个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();
两个(所有)语句都被执行了。当我尝试在SpringJDBCTemplate中执行同样的操作时,只执行了第一条语句

String sqlQuery = "CREATE TABLE A (...); CREATE TABLE B (...);"
org.springframework.jdbc.core.JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(sqlQuery);
有没有办法执行多个语句?在谷歌搜索时,我只找到了类似“手动拆分sqlQuery by
”这样的解决方案,这当然是无用的(需要更多的解析)。

也许Spring的解决方案在您的情况下会很有用。尤其是
executeSqlScript
方法


请注意,
DEFAULT_STATEMENT_SEPARATOR
的默认值为
“;”(请参阅)

我通过以下方式解决了此问题:

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;

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


我正在为我的项目寻找一个类似的选择,然后我偶然发现了以下几点


提供的Stackoverflow示例非常简洁,如果您希望Spring代表您处理样板sql处理

它似乎可以工作。虽然删除了注释(SQLite可以保留这些注释作为列的描述),但现在我并不担心这一点。是否有任何方法可以使用此executeSqlScript()方法更改行数?executeSqlScript现在已被弃用。有其他选择吗?@Daniele通常不推荐使用的方法会提示在JavaDoc中使用什么来代替。但是,即使在最新版本上,我也看不到任何弃用信息。你在看另一门课吗?@DarioSeidl是的,没错。这种反对从Spring4.0.3开始,赞成使用springframework.jdbc.datasource.init.ResourceDatabasePopulator
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();
        }
     }