diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterQueryTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterQueryTests.java index d4d2cb61e48..654d37bde38 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterQueryTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterQueryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2017 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. @@ -24,6 +24,7 @@ import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -56,8 +57,9 @@ public class NamedParameterQueryTests { private NamedParameterJdbcTemplate template; + @Before - public void setUp() throws Exception { + public void setup() throws Exception { connection = mock(Connection.class); dataSource = mock(DataSource.class); preparedStatement = mock(PreparedStatement.class); @@ -78,16 +80,17 @@ public class NamedParameterQueryTests { verify(connection).close(); } + @Test public void testQueryForListWithParamMap() throws Exception { given(resultSet.getMetaData()).willReturn(resultSetMetaData); given(resultSet.next()).willReturn(true, true, false); given(resultSet.getObject(1)).willReturn(11, 12); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); List> li = template.queryForList( - "SELECT AGE FROM CUSTMR WHERE ID < :id", parms); + "SELECT AGE FROM CUSTMR WHERE ID < :id", params); assertEquals("All rows returned", 2, li.size()); assertEquals("First row is Integer", 11, @@ -103,10 +106,10 @@ public class NamedParameterQueryTests { public void testQueryForListWithParamMapAndEmptyResult() throws Exception { given(resultSet.next()).willReturn(false); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); List> li = template.queryForList( - "SELECT AGE FROM CUSTMR WHERE ID < :id", parms); + "SELECT AGE FROM CUSTMR WHERE ID < :id", params); assertEquals("All rows returned", 0, li.size()); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?"); @@ -119,10 +122,10 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getObject(1)).willReturn(11); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); List> li = template.queryForList( - "SELECT AGE FROM CUSTMR WHERE ID < :id", parms); + "SELECT AGE FROM CUSTMR WHERE ID < :id", params); assertEquals("All rows returned", 1, li.size()); assertEquals("First row is Integer", 11, @@ -138,10 +141,10 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(11); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); List li = template.queryForList("SELECT AGE FROM CUSTMR WHERE ID < :id", - parms, Integer.class); + params, Integer.class); assertEquals("All rows returned", 1, li.size()); assertEquals("First row is Integer", 11, li.get(0).intValue()); @@ -155,9 +158,9 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getObject(1)).willReturn(11); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); - Map map = template.queryForMap("SELECT AGE FROM CUSTMR WHERE ID < :id", parms); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); + Map map = template.queryForMap("SELECT AGE FROM CUSTMR WHERE ID < :id", params); assertEquals("Row is Integer", 11, ((Integer) map.get("age")).intValue()); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?"); @@ -169,10 +172,10 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", - parms, new RowMapper() { + params, new RowMapper() { @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { return rs.getInt(1); @@ -190,10 +193,10 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - Map parms = new HashMap(); - parms.put("id", 3); + Map params = new HashMap<>(); + params.put("id", 3); Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", - parms, Integer.class); + params, Integer.class); assertTrue("Correct result type", o instanceof Integer); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?"); @@ -206,10 +209,10 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", - parms, Integer.class); + params, Integer.class); assertTrue("Correct result type", o instanceof Integer); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?"); @@ -224,9 +227,9 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("ids", Arrays.asList(3, 4)); - Object o = template.queryForObject(sql, parms, Integer.class); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("ids", Arrays.asList(3, 4)); + Object o = template.queryForObject(sql, params, Integer.class); assertTrue("Correct result type", o instanceof Integer); verify(connection).prepareStatement(sqlToUse); @@ -239,14 +242,14 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - MapSqlParameterSource parms = new MapSqlParameterSource(); - List l1 = new ArrayList(); + MapSqlParameterSource params = new MapSqlParameterSource(); + List l1 = new ArrayList<>(); l1.add(new Object[] {3, "Rod"}); l1.add(new Object[] {4, "Juergen"}); - parms.addValue("multiExpressionList", l1); + params.addValue("multiExpressionList", l1); Object o = template.queryForObject( "SELECT AGE FROM CUSTMR WHERE (ID, NAME) IN (:multiExpressionList)", - parms, Integer.class); + params, Integer.class); assertTrue("Correct result type", o instanceof Integer); verify(connection).prepareStatement( @@ -260,9 +263,9 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getInt(1)).willReturn(22); - MapSqlParameterSource parms = new MapSqlParameterSource(); - parms.addValue("id", 3); - int i = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", parms, Integer.class).intValue(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("id", 3); + int i = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", params, Integer.class).intValue(); assertEquals("Return of an int", 22, i); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?"); @@ -275,19 +278,33 @@ public class NamedParameterQueryTests { given(resultSet.next()).willReturn(true, false); given(resultSet.getLong(1)).willReturn(87L); - BeanPropertySqlParameterSource parms = new BeanPropertySqlParameterSource( - new ParameterBean(3)); - - long l = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", parms, Long.class).longValue(); + BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(new ParameterBean(3)); + long l = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id", params, Long.class).longValue(); assertEquals("Return of a long", 87, l); verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?"); verify(preparedStatement).setObject(1, 3, Types.INTEGER); } + @Test + public void testQueryForLongWithParamBeanWithCollection() throws Exception { + given(resultSet.getMetaData()).willReturn(resultSetMetaData); + given(resultSet.next()).willReturn(true, false); + given(resultSet.getLong(1)).willReturn(87L); + + BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(new ParameterCollectionBean(3, 5)); + long l = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID IN (:ids)", params, Long.class).longValue(); + + assertEquals("Return of a long", 87, l); + verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID IN (?, ?)"); + verify(preparedStatement).setObject(1, 3); + verify(preparedStatement).setObject(2, 5); + } + + static class ParameterBean { - private int id; + private final int id; public ParameterBean(int id) { this.id = id; @@ -298,4 +315,18 @@ public class NamedParameterQueryTests { } } + + static class ParameterCollectionBean { + + private final Collection ids; + + public ParameterCollectionBean(Integer... ids) { + this.ids = Arrays.asList(ids); + } + + public Collection getIds() { + return ids; + } + } + }