Browse Source

Refined SqlParameterSource batchUpdate tests (plus related polishing)

See gh-26071
5.0.x
Juergen Hoeller 5 years ago
parent
commit
1efcff1ea4
  1. 6
      spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java
  2. 11
      spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSourceUtils.java
  3. 17
      spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java

6
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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -31,7 +31,6 @@ import java.util.Set;
import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/** /**
* Helper class that efficiently creates multiple {@link PreparedStatementCreator} * Helper class that efficiently creates multiple {@link PreparedStatementCreator}
@ -193,9 +192,8 @@ public class PreparedStatementCreatorFactory {
public PreparedStatementCreatorImpl(String actualSql, List<?> parameters) { public PreparedStatementCreatorImpl(String actualSql, List<?> parameters) {
this.actualSql = actualSql; this.actualSql = actualSql;
Assert.notNull(parameters, "Parameters List must not be null");
this.parameters = parameters; this.parameters = parameters;
if (this.parameters.size() != declaredParameters.size()) { if (parameters.size() != declaredParameters.size()) {
// Account for named parameters being used multiple times // Account for named parameters being used multiple times
Set<String> names = new HashSet<>(); Set<String> names = new HashSet<>();
for (int i = 0; i < parameters.size(); i++) { for (int i = 0; i < parameters.size(); i++) {

11
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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 BeanPropertySqlParameterSource
* @see NamedParameterJdbcTemplate#batchUpdate(String, SqlParameterSource[]) * @see NamedParameterJdbcTemplate#batchUpdate(String, SqlParameterSource[])
*/ */
@SuppressWarnings("unchecked")
public static SqlParameterSource[] createBatch(Object... candidates) { public static SqlParameterSource[] createBatch(Object... candidates) {
return createBatch(Arrays.asList(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 source the source of parameter values and type information
* @param parameterName the name of the parameter * @param parameterName the name of the parameter
* @return the value object * @return the value object
* @see SqlParameterValue
*/ */
@Nullable @Nullable
public static Object getTypedValue(SqlParameterSource source, String parameterName) { public static Object getTypedValue(SqlParameterSource source, String parameterName) {
int sqlType = source.getSqlType(parameterName); int sqlType = source.getSqlType(parameterName);
if (sqlType != SqlParameterSource.TYPE_UNKNOWN) { if (sqlType != SqlParameterSource.TYPE_UNKNOWN) {
if (source.getTypeName(parameterName) != null) { return new SqlParameterValue(sqlType, source.getTypeName(parameterName), source.getValue(parameterName));
return new SqlParameterValue(sqlType, source.getTypeName(parameterName), source.getValue(parameterName));
}
else {
return new SqlParameterValue(sqlType, source.getValue(parameterName));
}
} }
else { else {
return source.getValue(parameterName); return source.getValue(parameterName);

17
spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -470,10 +470,11 @@ public class NamedParameterJdbcTemplateTests {
@Test @Test
public void testBatchUpdateWithSqlParameterSourcePlusTypeInfo() throws Exception { public void testBatchUpdateWithSqlParameterSourcePlusTypeInfo() throws Exception {
SqlParameterSource[] ids = new SqlParameterSource[2]; SqlParameterSource[] ids = new SqlParameterSource[3];
ids[0] = new MapSqlParameterSource().addValue("id", 100, Types.NUMERIC); ids[0] = new MapSqlParameterSource().addValue("id", null, Types.NULL);
ids[1] = new MapSqlParameterSource().addValue("id", 200, Types.NUMERIC); ids[1] = new MapSqlParameterSource().addValue("id", 100, Types.NUMERIC);
final int[] rowsAffected = new int[] {1, 2}; ids[2] = new MapSqlParameterSource().addValue("id", 200, Types.NUMERIC);
final int[] rowsAffected = new int[] {1, 2, 3};
given(preparedStatement.executeBatch()).willReturn(rowsAffected); given(preparedStatement.executeBatch()).willReturn(rowsAffected);
given(connection.getMetaData()).willReturn(databaseMetaData); given(connection.getMetaData()).willReturn(databaseMetaData);
@ -481,13 +482,15 @@ public class NamedParameterJdbcTemplateTests {
int[] actualRowsAffected = namedParameterTemplate.batchUpdate( int[] actualRowsAffected = namedParameterTemplate.batchUpdate(
"UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids); "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids);
assertTrue("executed 2 updates", actualRowsAffected.length == 2); assertTrue("executed 3 updates", actualRowsAffected.length == 3);
assertEquals(rowsAffected[0], actualRowsAffected[0]); assertEquals(rowsAffected[0], actualRowsAffected[0]);
assertEquals(rowsAffected[1], actualRowsAffected[1]); assertEquals(rowsAffected[1], actualRowsAffected[1]);
assertEquals(rowsAffected[2], actualRowsAffected[2]);
verify(connection).prepareStatement("UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"); 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, 100, Types.NUMERIC);
verify(preparedStatement).setObject(1, 200, Types.NUMERIC); verify(preparedStatement).setObject(1, 200, Types.NUMERIC);
verify(preparedStatement, times(2)).addBatch(); verify(preparedStatement, times(3)).addBatch();
verify(preparedStatement, atLeastOnce()).close(); verify(preparedStatement, atLeastOnce()).close();
verify(connection, atLeastOnce()).close(); verify(connection, atLeastOnce()).close();
} }

Loading…
Cancel
Save