web-dev-qa-db-ja.com

Spring JDBCテンプレートから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を手動で分割する」などの解決策しか見つかりませんでした。

16
Ondrej Skalicka

たぶん、Springの ScriptUtils が役に立つでしょう。特にexecuteSqlScriptメソッド。

ご了承ください DEFAULT_STATEMENT_SEPARATORのデフォルト値は';'定数フィールド値 を参照)

17
siphiuel

私はこの方法で問題を解決しました:

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

それを試してみてください

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();
        }
     }
5
CloudCode

SQLExecを使用して達成することもできます。以下のコードは私のために働いています。

import 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();
    }
}
0
chetan singhal