From 2abec6fd904c83ae6411976862b029e591700e01 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 25 Jun 2013 14:50:24 -0700 Subject: [PATCH] Include all SQL statements in batch fail exception Ensure any exception from calls to batchUpdate, on databases that support batch operations, contains all the SQL statements. Prior to this commit only the last SQL statement would be returned with the exception. Issue: SPR-10677 --- .../org/springframework/jdbc/core/JdbcTemplate.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java index 89092f58ea..4838235184 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java @@ -34,6 +34,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; + import javax.sql.DataSource; import org.springframework.dao.DataAccessException; @@ -49,6 +50,7 @@ import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; +import org.springframework.util.StringUtils; /** * This is the central class in the JDBC core package. @@ -544,18 +546,26 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { @Override public int[] batchUpdate(final String[] sql) throws DataAccessException { + Assert.notEmpty(sql, "SQL array must not be empty"); + if (logger.isDebugEnabled()) { logger.debug("Executing SQL batch update of " + sql.length + " statements"); } + class BatchUpdateStatementCallback implements StatementCallback, SqlProvider { + private String currSql; + @Override public int[] doInStatement(Statement stmt) throws SQLException, DataAccessException { + int[] rowsAffected = new int[sql.length]; + if (JdbcUtils.supportsBatchUpdates(stmt.getConnection())) { for (String sqlStmt : sql) { - this.currSql = sqlStmt; + this.currSql = (StringUtils.isEmpty(this.currSql) ? sqlStmt + : this.currSql + "; " + sqlStmt); stmt.addBatch(sqlStmt); } rowsAffected = stmt.executeBatch();