J'essaie d'écrire un peu de code qui lit un fichier SQL (plusieurs instructions CREATE TABLE
séparées par ;
) et exécute toutes les instructions.
En JDBC pur, je pourrais écrire:
String sqlQuery = "CREATE TABLE A (...); CREATE TABLE B (...);"
Java.sql.Connection connection = ...;
Statement statement = connection.createStatement();
statement.executeUpdate(sqlQuery);
statement.close();
et les deux (toutes) les déclarations ont été exécutées. Quand j'ai essayé de faire la même chose au printemps, JdbcTemplate, seule la première instruction est exécutée!
String sqlQuery = "CREATE TABLE A (...); CREATE TABLE B (...);"
org.springframework.jdbc.core.JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(sqlQuery);
Existe-t-il un moyen d'exécuter plusieurs instructions? En cherchant sur Google, je n'ai trouvé que des solutions telles que "diviser manuellement sqlQuery par ;
", ce qui est bien sûr inutile (cela nécessiterait beaucoup plus d'analyse).
Peut-être que Spring's ScriptUtils sera utile dans votre cas. Surtout les méthodes executeSqlScript
.
Notez que DEFAULT_STATEMENT_SEPARATOR
a une valeur par défaut de ';'
(voir Valeurs du champ constant )
J'ai résolu le problème de cette façon:
public void createDefaultDB(DataSource dataSource) {
Resource resource = new ClassPathResource("CreateDefaultDB.sql");
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource);
databasePopulator.execute(dataSource);
}
l'essayer
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();
}
}
Nous pouvons également atteindre SQLExec. Le code ci-dessous fonctionne pour moi.
importer 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();
}
}