diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java index c7aab55d29..805698dcaa 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,6 @@ import java.util.Set; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.lang.Nullable; -import org.springframework.util.Assert; /** * Helper class that efficiently creates multiple {@link PreparedStatementCreator} @@ -200,9 +199,8 @@ public class PreparedStatementCreatorFactory { public PreparedStatementCreatorImpl(String actualSql, List parameters) { this.actualSql = actualSql; - Assert.notNull(parameters, "Parameters List must not be null"); this.parameters = parameters; - if (this.parameters.size() != declaredParameters.size()) { + if (parameters.size() != declaredParameters.size()) { // Account for named parameters being used multiple times Set names = new HashSet<>(); for (int i = 0; i < parameters.size(); i++) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java index 068d4d01ac..f5c52b2095 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -345,9 +345,9 @@ public abstract class NamedParameterUtils { for (int i = 0; i < paramNames.size(); i++) { String paramName = paramNames.get(i); try { - Object value = paramSource.getValue(paramName); SqlParameter param = findParameter(declaredParams, paramName, i); - paramArray[i] = (param != null ? new SqlParameterValue(param, value) : value); + paramArray[i] = (param != null ? new SqlParameterValue(param, paramSource.getValue(paramName)) : + SqlParameterSourceUtils.getTypedValue(paramSource, paramName)); } catch (IllegalArgumentException ex) { throw new InvalidDataAccessApiUsageException( 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 bb9a000df3..e2bd60e05f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,6 @@ public abstract class SqlParameterSourceUtils { * @see BeanPropertySqlParameterSource * @see NamedParameterJdbcTemplate#batchUpdate(String, SqlParameterSource[]) */ - @SuppressWarnings("unchecked") public static SqlParameterSource[] createBatch(Object... candidates) { return createBatch(Arrays.asList(candidates)); } @@ -93,17 +92,13 @@ public abstract class SqlParameterSourceUtils { * @param source the source of parameter values and type information * @param parameterName the name of the parameter * @return the value object + * @see SqlParameterValue */ @Nullable public static Object getTypedValue(SqlParameterSource source, String parameterName) { int sqlType = source.getSqlType(parameterName); if (sqlType != SqlParameterSource.TYPE_UNKNOWN) { - if (source.getTypeName(parameterName) != null) { - return new SqlParameterValue(sqlType, source.getTypeName(parameterName), source.getValue(parameterName)); - } - else { - return new SqlParameterValue(sqlType, source.getValue(parameterName)); - } + return new SqlParameterValue(sqlType, source.getTypeName(parameterName), source.getValue(parameterName)); } else { return source.getValue(parameterName); diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java index 48a0e52a89..43342ab329 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java @@ -526,10 +526,11 @@ public class NamedParameterJdbcTemplateTests { @Test public void testBatchUpdateWithSqlParameterSourcePlusTypeInfo() throws Exception { - SqlParameterSource[] ids = new SqlParameterSource[2]; - ids[0] = new MapSqlParameterSource().addValue("id", 100, Types.NUMERIC); - ids[1] = new MapSqlParameterSource().addValue("id", 200, Types.NUMERIC); - final int[] rowsAffected = new int[] {1, 2}; + SqlParameterSource[] ids = new SqlParameterSource[3]; + ids[0] = new MapSqlParameterSource().addValue("id", null, Types.NULL); + ids[1] = new MapSqlParameterSource().addValue("id", 100, Types.NUMERIC); + ids[2] = new MapSqlParameterSource().addValue("id", 200, Types.NUMERIC); + final int[] rowsAffected = new int[] {1, 2, 3}; given(preparedStatement.executeBatch()).willReturn(rowsAffected); given(connection.getMetaData()).willReturn(databaseMetaData); @@ -537,13 +538,15 @@ public class NamedParameterJdbcTemplateTests { int[] actualRowsAffected = namedParameterTemplate.batchUpdate( "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids); - assertThat(actualRowsAffected.length == 2).as("executed 2 updates").isTrue(); + assertThat(actualRowsAffected.length == 3).as("executed 3 updates").isTrue(); assertThat(actualRowsAffected[0]).isEqualTo(rowsAffected[0]); assertThat(actualRowsAffected[1]).isEqualTo(rowsAffected[1]); + assertThat(actualRowsAffected[2]).isEqualTo(rowsAffected[2]); verify(connection).prepareStatement("UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"); + verify(preparedStatement).setNull(1, Types.NULL); verify(preparedStatement).setObject(1, 100, Types.NUMERIC); verify(preparedStatement).setObject(1, 200, Types.NUMERIC); - verify(preparedStatement, times(2)).addBatch(); + verify(preparedStatement, times(3)).addBatch(); verify(preparedStatement, atLeastOnce()).close(); verify(connection, atLeastOnce()).close(); }