/* * Copyright 2002-2013 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.core.simple; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; /** * @author Rod Johnson * @author Rob Harrop * @author Juergen Hoeller * @author Thomas Risberg */ @Deprecated public class SimpleJdbcTemplateTests { private static final String SQL = "sql"; private static final Object[] ARGS_ARRAY = { 24.7, "foo", new Object() }; private static final Map<String, Object> ARGS_MAP; private static final MapSqlParameterSource ARGS_SOURCE; static { ARGS_MAP = new HashMap<String, Object>(3); ARGS_SOURCE = new MapSqlParameterSource(); for (int i = 0; i < ARGS_ARRAY.length; i++) { ARGS_MAP.put(String.valueOf(i), ARGS_ARRAY[i]); ARGS_SOURCE.addValue(String.valueOf(i), ARGS_ARRAY[i]); } } private JdbcOperations operations; private NamedParameterJdbcOperations namedParameterOperations; private SimpleJdbcTemplate template; private SimpleJdbcTemplate namedParameterTemplate; @Before public void setup() { this.operations = mock(JdbcOperations.class); this.namedParameterOperations = mock(NamedParameterJdbcOperations.class); this.template = new SimpleJdbcTemplate(operations); this.namedParameterTemplate = new SimpleJdbcTemplate(namedParameterOperations); } @Test public void testQueryForIntWithoutArgs() { given(operations.queryForInt(SQL)).willReturn(666); int result = template.queryForInt(SQL); assertEquals(666, result); } @Test public void testQueryForIntWithArgs() { given(operations.queryForInt(SQL, new Object[] { 24, "foo" })).willReturn(666); int result = template.queryForInt(SQL, 24, "foo"); assertEquals(666, result); } @Test public void testQueryForIntWithMap() { Map<String, Object> args = new HashMap<String, Object>(2); args.put("id", 24); args.put("xy", "foo"); given(namedParameterOperations.queryForInt(SQL, args)).willReturn(666); int result = namedParameterTemplate.queryForInt(SQL, args); assertEquals(666, result); } @Test public void testQueryForIntWitSqlParameterSource() { SqlParameterSource args = new MapSqlParameterSource().addValue("id", 24).addValue("xy", "foo"); given(namedParameterOperations.queryForInt(SQL, args)).willReturn(666); int result = namedParameterTemplate.queryForInt(SQL, args); assertEquals(666, result); } @Test public void testQueryForLongWithoutArgs() { given(operations.queryForLong(SQL)).willReturn((long) 666); long result = template.queryForLong(SQL); assertEquals(666, result); } @Test public void testQueryForLongWithArgs() { long expectedResult = 666; given(operations.queryForLong(SQL, ARGS_ARRAY)).willReturn(expectedResult); long result = template.queryForLong(SQL, ARGS_ARRAY); assertEquals(expectedResult, result); } @Test public void testQueryForObjectWithoutArgs() throws Exception { Date expectedResult = new Date(); given(operations.queryForObject(SQL, Date.class)).willReturn(expectedResult); Date result = template.queryForObject(SQL, Date.class); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithArgs() throws Exception { Date expectedResult = new Date(); given(operations.queryForObject(SQL, ARGS_ARRAY, Date.class) ).willReturn(expectedResult); Date result = template.queryForObject(SQL, Date.class,ARGS_ARRAY); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithArgArray() throws Exception { Date expectedResult = new Date(); given(operations.queryForObject(SQL, ARGS_ARRAY, Date.class) ).willReturn(expectedResult); Date result = template.queryForObject(SQL, Date.class, ARGS_ARRAY); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithMap() throws Exception { Date expectedResult = new Date(); given(operations.queryForObject(SQL, ARGS_ARRAY, Date.class) ).willReturn(expectedResult); Date result = template.queryForObject(SQL, Date.class, ARGS_ARRAY); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithRowMapperAndWithoutArgs() throws Exception { Date expectedResult = new Date(); ParameterizedRowMapper<Date> rm = new ParameterizedRowMapper<Date>() { @Override public Date mapRow(ResultSet rs, int rowNum) { return new Date(); } }; given(operations.queryForObject(SQL, rm)).willReturn(expectedResult); Date result = template.queryForObject(SQL, rm); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithRowMapperAndArgs() throws Exception { Date expectedResult = new Date(); ParameterizedRowMapper<Date> rm = new ParameterizedRowMapper<Date>() { @Override public Date mapRow(ResultSet rs, int rowNum) { return new Date(); } }; given(operations.queryForObject(SQL, ARGS_ARRAY, rm) ).willReturn(expectedResult); Date result = template.queryForObject(SQL, rm, ARGS_ARRAY); assertSame(expectedResult, result); } @Test public void testQueryForObjectWithRowMapperAndMap() throws Exception { String sql = "SELECT SOMEDATE FROM BAR WHERE ID=? AND XY=?"; Date expectedResult = new Date(); ParameterizedRowMapper<Date> rm = new ParameterizedRowMapper<Date>() { @Override public Date mapRow(ResultSet rs, int rowNum) { return new Date(); } }; given(operations.queryForObject(sql, ARGS_ARRAY, rm) ).willReturn(expectedResult); Date result = template.queryForObject(sql, rm, ARGS_ARRAY); assertSame(expectedResult, result); } @Test public void testQueryForListWithoutArgs() throws Exception { List<Map<String, Object>> expectedResult = mockListMapResult(); given(operations.queryForList(SQL)).willReturn(expectedResult); List<Map<String, Object>> result = template.queryForList(SQL); assertSame(expectedResult, result); } @Test public void testQueryForListWithArgs() throws Exception { List<Map<String, Object>> expectedResult = mockListMapResult(); given(operations.queryForList(SQL, 1, 2, 3)).willReturn(expectedResult); List<Map<String, Object>> result = template.queryForList(SQL, 1,2,3); assertSame(expectedResult, result); } @Test public void testQueryForListWithMap() throws Exception { List<Map<String, Object>> expectedResult = mockListMapResult(); given(namedParameterOperations.queryForList(SQL, ARGS_MAP)).willReturn(expectedResult); List<Map<String, Object>> result = namedParameterTemplate.queryForList(SQL, ARGS_MAP); assertSame(expectedResult, result); } @Test public void testQueryForListWithSqlParameterSource() throws Exception { List<Map<String, Object>> expectedResult = mockListMapResult(); given(namedParameterOperations.queryForList(SQL, ARGS_SOURCE)).willReturn(expectedResult); List<Map<String, Object>> result = namedParameterTemplate.queryForList(SQL, ARGS_SOURCE); assertSame(expectedResult, result); } @Test public void testQueryForMapWithoutArgs() throws Exception { Map<String, Object> expectedResult = new HashMap<String, Object>(); given(operations.queryForMap(SQL)).willReturn(expectedResult); Map<String, Object> result = template.queryForMap(SQL); assertSame(expectedResult, result); } @Test public void testQueryForMapWithArgs() throws Exception { Map<String, Object> expectedResult = new HashMap<String, Object>(); given(operations.queryForMap(SQL, 1, 2, 3)).willReturn(expectedResult); Map<String, Object> result = template.queryForMap(SQL, 1,2,3); assertSame(expectedResult, result); } @Test public void testQueryForMapWithMap() throws Exception { Map<String, Object> expectedResult = new HashMap<String, Object>(); given(namedParameterOperations.queryForMap(SQL, ARGS_MAP)).willReturn(expectedResult); Map<String, Object> result = namedParameterTemplate.queryForMap(SQL, ARGS_MAP); assertSame(expectedResult, result); } @Test public void testQueryForMapWithSqlParameterSource() throws Exception { Map<String, Object> expectedResult = new HashMap<String, Object>(); given(namedParameterOperations.queryForMap(SQL, ARGS_SOURCE)).willReturn(expectedResult); Map<String, Object> result = namedParameterTemplate.queryForMap(SQL, ARGS_SOURCE); assertSame(expectedResult, result); } @Test public void testUpdateWithoutArgs() throws Exception { given(operations.update(SQL)).willReturn(666); int result = template.update(SQL); assertEquals(666, result); } @Test public void testUpdateWithArgs() throws Exception { given(operations.update(SQL, 1, 2, 3)).willReturn(666); int result = template.update(SQL, 1, 2, 3); assertEquals(666, result); } @Test public void testUpdateWithMap() throws Exception { given(namedParameterOperations.update(SQL, ARGS_MAP)).willReturn(666); int result = namedParameterTemplate.update(SQL, ARGS_MAP); assertEquals(666, result); } @Test public void testUpdateWithSqlParameterSource() throws Exception { given(namedParameterOperations.update(SQL, ARGS_SOURCE)).willReturn(666); int result = namedParameterTemplate.update(SQL, ARGS_SOURCE); assertEquals(666, result); } @Test public void testBatchUpdateWithSqlParameterSource() throws Exception { PreparedStatement preparedStatement = setupBatchOperation(); final SqlParameterSource[] ids = new SqlParameterSource[2]; ids[0] = new MapSqlParameterSource("id", 100); ids[1] = new MapSqlParameterSource("id", 200); int[] actualRowsAffected = template.batchUpdate("UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids); assertTrue("executed 2 updates", actualRowsAffected.length == 2); assertEquals(1, actualRowsAffected[0]); assertEquals(2, actualRowsAffected[1]); verify(preparedStatement).setObject(1, 100); verify(preparedStatement).setObject(1, 200); verify(preparedStatement, times(2)).addBatch(); verify(preparedStatement).close(); } @Test public void testBatchUpdateWithListOfObjectArrays() throws Exception { PreparedStatement preparedStatement = setupBatchOperation(); List<Object[]> ids = new ArrayList<Object[]>(); ids.add(new Object[] { 100 }); ids.add(new Object[] { 200 }); int[] actualRowsAffected = template.batchUpdate(SQL, ids); assertTrue("executed 2 updates", actualRowsAffected.length == 2); assertEquals(1, actualRowsAffected[0]); assertEquals(2, actualRowsAffected[1]); verify(preparedStatement).setObject(1, 100); verify(preparedStatement).setObject(1, 200); verify(preparedStatement, times(2)).addBatch(); verify(preparedStatement).close(); } @Test public void testBatchUpdateWithListOfObjectArraysPlusTypeInfo() throws Exception { int[] sqlTypes = new int[] { Types.NUMERIC }; PreparedStatement preparedStatement = setupBatchOperation(); List<Object[]> ids = new ArrayList<Object[]>(); ids.add(new Object[] { 100 }); ids.add(new Object[] { 200 }); int[] actualRowsAffected = template.batchUpdate(SQL, ids, sqlTypes); assertTrue("executed 2 updates", actualRowsAffected.length == 2); assertEquals(1, actualRowsAffected[0]); assertEquals(2, actualRowsAffected[1]); verify(preparedStatement).setObject(1, 100, Types.NUMERIC); verify(preparedStatement).setObject(1, 200, Types.NUMERIC); verify(preparedStatement, times(2)).addBatch(); verify(preparedStatement).close(); } private PreparedStatement setupBatchOperation() throws SQLException { DataSource dataSource = mock(DataSource.class); Connection connection = mock(Connection.class); PreparedStatement preparedStatement = mock(PreparedStatement.class); DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class); given(dataSource.getConnection()).willReturn(connection); given(preparedStatement.getConnection()).willReturn(connection); given(preparedStatement.executeBatch()).willReturn(new int[] { 1, 2 }); given(databaseMetaData.getDatabaseProductName()).willReturn("MySQL"); given(databaseMetaData.supportsBatchUpdates()).willReturn(true); given(connection.prepareStatement(anyString())).willReturn(preparedStatement); given(connection.getMetaData()).willReturn(databaseMetaData); template = new SimpleJdbcTemplate(new JdbcTemplate(dataSource, false)); return preparedStatement; } private List<Map<String, Object>> mockListMapResult() { return new LinkedList<Map<String, Object>>(); } }