From a8b48848b9354c277f032c35a0adf1ea5cbef50a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sun, 19 Nov 2017 21:17:24 +0100 Subject: [PATCH] SqlParameterSourceUtils.createBatch with Collection support Issue: SPR-16215 --- .../jdbc/core/BatchUpdateUtils.java | 4 +- .../NamedParameterJdbcTemplate.java | 8 +- .../namedparam/SqlParameterSourceUtils.java | 75 +++++++++++++------ 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BatchUpdateUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BatchUpdateUtils.java index fb96c074833..fbf1ea93450 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BatchUpdateUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BatchUpdateUtils.java @@ -23,8 +23,8 @@ import java.util.List; import org.springframework.lang.Nullable; /** - * Generic utility methods for working with JDBC batch statements. Mainly for internal use - * within the framework. + * Generic utility methods for working with JDBC batch statements. + * Mainly for internal use within the framework. * * @author Thomas Risberg * @since 3.0 diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java index 5f478b6f322..810d08f0249 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java @@ -337,13 +337,7 @@ public class NamedParameterJdbcTemplate implements NamedParameterJdbcOperations @Override public int[] batchUpdate(String sql, Map[] batchValues) { - SqlParameterSource[] batchArgs = new SqlParameterSource[batchValues.length]; - int i = 0; - for (Map values : batchValues) { - batchArgs[i] = new MapSqlParameterSource(values); - i++; - } - return batchUpdate(sql, batchArgs); + return batchUpdate(sql, SqlParameterSourceUtils.createBatch(batchValues)); } @Override diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSourceUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSourceUtils.java index 2dbf8e8972a..0d4c6dbe97e 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSourceUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSourceUtils.java @@ -16,6 +16,8 @@ package org.springframework.jdbc.core.namedparam; +import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -23,47 +25,72 @@ import org.springframework.jdbc.core.SqlParameterValue; import org.springframework.lang.Nullable; /** - * Class that provides helper methods for the use of {@link SqlParameterSource} - * with {@code SimpleJdbc} classes. + * Class that provides helper methods for the use of {@link SqlParameterSource}, + * in particular with {@link NamedParameterJdbcTemplate}. * * @author Thomas Risberg + * @author Juergen Hoeller * @since 2.5 */ -public class SqlParameterSourceUtils { +public abstract class SqlParameterSourceUtils { /** - * Create an array of MapSqlParameterSource objects populated with data from the - * values passed in. This will define what is included in a batch operation. - * @param valueMaps array of Maps containing the values to be used - * @return an array of SqlParameterSource + * Create an array of {@link SqlParameterSource} objects populated with data + * from the values passed in (either a {@link Map} or a bean object). + * This will define what is included in a batch operation. + * @param candidates object array of objects containing the values to be used + * @return an array of {@link SqlParameterSource} + * @see MapSqlParameterSource + * @see BeanPropertySqlParameterSource + * @see NamedParameterJdbcTemplate#batchUpdate(String, SqlParameterSource[])) */ - public static SqlParameterSource[] createBatch(Map[] valueMaps) { - MapSqlParameterSource[] batch = new MapSqlParameterSource[valueMaps.length]; - for (int i = 0; i < valueMaps.length; i++) { - Map valueMap = valueMaps[i]; - batch[i] = new MapSqlParameterSource(valueMap); + @SuppressWarnings("unchecked") + public static SqlParameterSource[] createBatch(Object... candidates) { + return createBatch(Arrays.asList(candidates)); + } + + /** + * Create an array of {@link SqlParameterSource} objects populated with data + * from the values passed in (either a {@link Map} or a bean object). + * This will define what is included in a batch operation. + * @param candidates collection of objects containing the values to be used + * @return an array of {@link SqlParameterSource} + * @since 5.0.2 + * @see MapSqlParameterSource + * @see BeanPropertySqlParameterSource + * @see NamedParameterJdbcTemplate#batchUpdate(String, SqlParameterSource[])) + */ + @SuppressWarnings("unchecked") + public static SqlParameterSource[] createBatch(Collection candidates) { + SqlParameterSource[] batch = new SqlParameterSource[candidates.size()]; + int i = 0; + for (Object candidate : candidates) { + batch[i] = (candidate instanceof Map ? new MapSqlParameterSource((Map) candidate) : + new BeanPropertySqlParameterSource(candidate)); + i++; } return batch; } /** - * Create an array of BeanPropertySqlParameterSource objects populated with data - * from the values passed in. This will define what is included in a batch operation. - * @param beans object array of beans containing the values to be used - * @return an array of SqlParameterSource + * Create an array of {@link MapSqlParameterSource} objects populated with data from + * the values passed in. This will define what is included in a batch operation. + * @param valueMaps array of {@link Map} instances containing the values to be used + * @return an array of {@link SqlParameterSource} + * @see MapSqlParameterSource + * @see NamedParameterJdbcTemplate#batchUpdate(String, Map[]) */ - public static SqlParameterSource[] createBatch(Object[] beans) { - BeanPropertySqlParameterSource[] batch = new BeanPropertySqlParameterSource[beans.length]; - for (int i = 0; i < beans.length; i++) { - Object bean = beans[i]; - batch[i] = new BeanPropertySqlParameterSource(bean); + public static SqlParameterSource[] createBatch(Map[] valueMaps) { + SqlParameterSource[] batch = new SqlParameterSource[valueMaps.length]; + for (int i = 0; i < valueMaps.length; i++) { + batch[i] = new MapSqlParameterSource(valueMaps[i]); } return batch; } /** * Create a wrapped value if parameter has type information, plain object if not. - * @param source the source of paramer values and type information + * @param source the source of parameter values and type information * @param parameterName the name of the parameter * @return the value object */ @@ -85,13 +112,13 @@ public class SqlParameterSourceUtils { /** * Create a Map of case insensitive parameter names together with the original name. - * @param parameterSource the source of paramer names + * @param parameterSource the source of parameter names * @return the Map that can be used for case insensitive matching of parameter names */ public static Map extractCaseInsensitiveParameterNames(SqlParameterSource parameterSource) { Map caseInsensitiveParameterNames = new HashMap<>(); if (parameterSource instanceof BeanPropertySqlParameterSource) { - String[] propertyNames = ((BeanPropertySqlParameterSource)parameterSource).getReadablePropertyNames(); + String[] propertyNames = ((BeanPropertySqlParameterSource) parameterSource).getReadablePropertyNames(); for (String name : propertyNames) { caseInsensitiveParameterNames.put(name.toLowerCase(), name); }