/*
* Copyright 2002-2014 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jdbc.object;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.Types;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.jdbc.core.SqlParameter;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
/**
* @author Juergen Hoeller
* @since 22.02.2005
*/
public class BatchSqlUpdateTests {
@Test
public void testBatchUpdateWithExplicitFlush() throws Exception {
doTestBatchUpdate(false);
}
@Test
public void testBatchUpdateWithFlushThroughBatchSize() throws Exception {
doTestBatchUpdate(true);
}
private void doTestBatchUpdate(boolean flushThroughBatchSize) throws Exception {
final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?";
final int[] ids = new int[] { 100, 200 };
final int[] rowsAffected = new int[] { 1, 2 };
Connection connection = mock(Connection.class);
DataSource dataSource = mock(DataSource.class);
given(dataSource.getConnection()).willReturn(connection);
PreparedStatement preparedStatement = mock(PreparedStatement.class);
given(preparedStatement.getConnection()).willReturn(connection);
given(preparedStatement.executeBatch()).willReturn(rowsAffected);
DatabaseMetaData mockDatabaseMetaData = mock(DatabaseMetaData.class);
given(mockDatabaseMetaData.supportsBatchUpdates()).willReturn(true);
given(connection.prepareStatement(sql)).willReturn(preparedStatement);
given(connection.getMetaData()).willReturn(mockDatabaseMetaData);
BatchSqlUpdate update = new BatchSqlUpdate(dataSource, sql);
update.declareParameter(new SqlParameter(Types.INTEGER));
if (flushThroughBatchSize) {
update.setBatchSize(2);
}
update.update(ids[0]);
update.update(ids[1]);
if (flushThroughBatchSize) {
assertEquals(0, update.getQueueCount());
assertEquals(2, update.getRowsAffected().length);
}
else {
assertEquals(2, update.getQueueCount());
assertEquals(0, update.getRowsAffected().length);
}
int[] actualRowsAffected = update.flush();
assertEquals(0, update.getQueueCount());
if (flushThroughBatchSize) {
assertTrue("flush did not execute updates", actualRowsAffected.length == 0);
}
else {
assertTrue("executed 2 updates", actualRowsAffected.length == 2);
assertEquals(rowsAffected[0], actualRowsAffected[0]);
assertEquals(rowsAffected[1], actualRowsAffected[1]);
}
actualRowsAffected = update.getRowsAffected();
assertTrue("executed 2 updates", actualRowsAffected.length == 2);
assertEquals(rowsAffected[0], actualRowsAffected[0]);
assertEquals(rowsAffected[1], actualRowsAffected[1]);
update.reset();
assertEquals(0, update.getRowsAffected().length);
verify(preparedStatement).setObject(1, ids[0], Types.INTEGER);
verify(preparedStatement).setObject(1, ids[1], Types.INTEGER);
verify(preparedStatement, times(2)).addBatch();
verify(preparedStatement).close();
}
}