/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterQueryTests.java

https://github.com/sidneyzhang/spring-framework · Java · 305 lines · 229 code · 57 blank · 19 comment · 0 complexity · 8ddbb6eaef437ba4ef28b455631b77fc MD5 · raw file

  1. /*
  2. * Copyright 2002-2012 the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.springframework.jdbc.core.namedparam;
  17. import static org.junit.Assert.assertEquals;
  18. import static org.junit.Assert.assertTrue;
  19. import static org.mockito.BDDMockito.given;
  20. import static org.mockito.Matchers.anyString;
  21. import static org.mockito.Mockito.mock;
  22. import static org.mockito.Mockito.verify;
  23. import java.sql.Connection;
  24. import java.sql.PreparedStatement;
  25. import java.sql.ResultSet;
  26. import java.sql.ResultSetMetaData;
  27. import java.sql.SQLException;
  28. import java.sql.Types;
  29. import java.util.ArrayList;
  30. import java.util.Arrays;
  31. import java.util.HashMap;
  32. import java.util.List;
  33. import java.util.Map;
  34. import javax.sql.DataSource;
  35. import org.junit.After;
  36. import org.junit.Before;
  37. import org.junit.Test;
  38. import org.springframework.jdbc.core.RowMapper;
  39. /**
  40. * @author Thomas Risberg
  41. * @author Phillip Webb
  42. */
  43. public class NamedParameterQueryTests {
  44. private DataSource dataSource;
  45. private Connection connection;
  46. private PreparedStatement preparedStatement;
  47. private ResultSet resultSet;
  48. private ResultSetMetaData resultSetMetaData;
  49. private NamedParameterJdbcTemplate template;
  50. @Before
  51. public void setUp() throws Exception {
  52. connection = mock(Connection.class);
  53. dataSource = mock(DataSource.class);
  54. preparedStatement = mock(PreparedStatement.class);
  55. resultSet = mock(ResultSet.class);
  56. resultSetMetaData = mock(ResultSetMetaData.class);
  57. template = new NamedParameterJdbcTemplate(dataSource);
  58. given(dataSource.getConnection()).willReturn(connection);
  59. given(resultSetMetaData.getColumnCount()).willReturn(1);
  60. given(resultSetMetaData.getColumnLabel(1)).willReturn("age");
  61. given(connection.prepareStatement(anyString())).willReturn(preparedStatement);
  62. given(preparedStatement.executeQuery()).willReturn(resultSet);
  63. }
  64. @After
  65. public void verifyClose() throws Exception {
  66. verify(preparedStatement).close();
  67. verify(resultSet).close();
  68. verify(connection).close();
  69. }
  70. @Test
  71. public void testQueryForListWithParamMap() throws Exception {
  72. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  73. given(resultSet.next()).willReturn(true, true, false);
  74. given(resultSet.getObject(1)).willReturn(11, 12);
  75. MapSqlParameterSource parms = new MapSqlParameterSource();
  76. parms.addValue("id", 3);
  77. List<Map<String, Object>> li = template.queryForList(
  78. "SELECT AGE FROM CUSTMR WHERE ID < :id", parms);
  79. assertEquals("All rows returned", 2, li.size());
  80. assertEquals("First row is Integer", 11,
  81. ((Integer) ((Map) li.get(0)).get("age")).intValue());
  82. assertEquals("Second row is Integer", 12,
  83. ((Integer) ((Map) li.get(1)).get("age")).intValue());
  84. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?");
  85. verify(preparedStatement).setObject(1, 3);
  86. }
  87. @Test
  88. public void testQueryForListWithParamMapAndEmptyResult() throws Exception {
  89. given(resultSet.next()).willReturn(false);
  90. MapSqlParameterSource parms = new MapSqlParameterSource();
  91. parms.addValue("id", 3);
  92. List<Map<String, Object>> li = template.queryForList(
  93. "SELECT AGE FROM CUSTMR WHERE ID < :id", parms);
  94. assertEquals("All rows returned", 0, li.size());
  95. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?");
  96. verify(preparedStatement).setObject(1, 3);
  97. }
  98. @Test
  99. public void testQueryForListWithParamMapAndSingleRowAndColumn() throws Exception {
  100. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  101. given(resultSet.next()).willReturn(true, false);
  102. given(resultSet.getObject(1)).willReturn(11);
  103. MapSqlParameterSource parms = new MapSqlParameterSource();
  104. parms.addValue("id", 3);
  105. List<Map<String, Object>> li = template.queryForList(
  106. "SELECT AGE FROM CUSTMR WHERE ID < :id", parms);
  107. assertEquals("All rows returned", 1, li.size());
  108. assertEquals("First row is Integer", 11,
  109. ((Integer) ((Map) li.get(0)).get("age")).intValue());
  110. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?");
  111. verify(preparedStatement).setObject(1, 3);
  112. }
  113. @Test
  114. public void testQueryForListWithParamMapAndIntegerElementAndSingleRowAndColumn()
  115. throws Exception {
  116. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  117. given(resultSet.next()).willReturn(true, false);
  118. given(resultSet.getInt(1)).willReturn(11);
  119. MapSqlParameterSource parms = new MapSqlParameterSource();
  120. parms.addValue("id", 3);
  121. List<Integer> li = template.queryForList("SELECT AGE FROM CUSTMR WHERE ID < :id",
  122. parms, Integer.class);
  123. assertEquals("All rows returned", 1, li.size());
  124. assertEquals("First row is Integer", 11, li.get(0).intValue());
  125. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?");
  126. verify(preparedStatement).setObject(1, 3);
  127. }
  128. @Test
  129. public void testQueryForMapWithParamMapAndSingleRowAndColumn() throws Exception {
  130. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  131. given(resultSet.next()).willReturn(true, false);
  132. given(resultSet.getObject(1)).willReturn(11);
  133. MapSqlParameterSource parms = new MapSqlParameterSource();
  134. parms.addValue("id", 3);
  135. Map map = template.queryForMap("SELECT AGE FROM CUSTMR WHERE ID < :id", parms);
  136. assertEquals("Row is Integer", 11, ((Integer) map.get("age")).intValue());
  137. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID < ?");
  138. verify(preparedStatement).setObject(1, 3);
  139. }
  140. @Test
  141. public void testQueryForObjectWithParamMapAndRowMapper() throws Exception {
  142. given(resultSet.next()).willReturn(true, false);
  143. given(resultSet.getInt(1)).willReturn(22);
  144. MapSqlParameterSource parms = new MapSqlParameterSource();
  145. parms.addValue("id", 3);
  146. Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id",
  147. parms, new RowMapper<Object>() {
  148. @Override
  149. public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
  150. return rs.getInt(1);
  151. }
  152. });
  153. assertTrue("Correct result type", o instanceof Integer);
  154. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?");
  155. verify(preparedStatement).setObject(1, 3);
  156. }
  157. @Test
  158. public void testQueryForObjectWithMapAndInteger() throws Exception {
  159. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  160. given(resultSet.next()).willReturn(true, false);
  161. given(resultSet.getInt(1)).willReturn(22);
  162. Map<String, Object> parms = new HashMap<String, Object>();
  163. parms.put("id", 3);
  164. Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id",
  165. parms, Integer.class);
  166. assertTrue("Correct result type", o instanceof Integer);
  167. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?");
  168. verify(preparedStatement).setObject(1, 3);
  169. }
  170. @Test
  171. public void testQueryForObjectWithParamMapAndInteger() throws Exception {
  172. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  173. given(resultSet.next()).willReturn(true, false);
  174. given(resultSet.getInt(1)).willReturn(22);
  175. MapSqlParameterSource parms = new MapSqlParameterSource();
  176. parms.addValue("id", 3);
  177. Object o = template.queryForObject("SELECT AGE FROM CUSTMR WHERE ID = :id",
  178. parms, Integer.class);
  179. assertTrue("Correct result type", o instanceof Integer);
  180. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?");
  181. verify(preparedStatement).setObject(1, 3);
  182. }
  183. @Test
  184. public void testQueryForObjectWithParamMapAndList() throws Exception {
  185. String sql = "SELECT AGE FROM CUSTMR WHERE ID IN (:ids)";
  186. String sqlToUse = "SELECT AGE FROM CUSTMR WHERE ID IN (?, ?)";
  187. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  188. given(resultSet.next()).willReturn(true, false);
  189. given(resultSet.getInt(1)).willReturn(22);
  190. MapSqlParameterSource parms = new MapSqlParameterSource();
  191. parms.addValue("ids", Arrays.asList(new Object[] { 3, 4 }));
  192. Object o = template.queryForObject(sql, parms, Integer.class);
  193. assertTrue("Correct result type", o instanceof Integer);
  194. verify(connection).prepareStatement(sqlToUse);
  195. verify(preparedStatement).setObject(1, 3);
  196. }
  197. @Test
  198. public void testQueryForObjectWithParamMapAndListOfExpressionLists() throws Exception {
  199. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  200. given(resultSet.next()).willReturn(true, false);
  201. given(resultSet.getInt(1)).willReturn(22);
  202. MapSqlParameterSource parms = new MapSqlParameterSource();
  203. List<Object[]> l1 = new ArrayList<Object[]>();
  204. l1.add(new Object[] { 3, "Rod" });
  205. l1.add(new Object[] { 4, "Juergen" });
  206. parms.addValue("multiExpressionList", l1);
  207. Object o = template.queryForObject(
  208. "SELECT AGE FROM CUSTMR WHERE (ID, NAME) IN (:multiExpressionList)",
  209. parms, Integer.class);
  210. assertTrue("Correct result type", o instanceof Integer);
  211. verify(connection).prepareStatement(
  212. "SELECT AGE FROM CUSTMR WHERE (ID, NAME) IN ((?, ?), (?, ?))");
  213. verify(preparedStatement).setObject(1, 3);
  214. }
  215. @Test
  216. public void testQueryForIntWithParamMap() throws Exception {
  217. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  218. given(resultSet.next()).willReturn(true, false);
  219. given(resultSet.getInt(1)).willReturn(22);
  220. MapSqlParameterSource parms = new MapSqlParameterSource();
  221. parms.addValue("id", 3);
  222. int i = template.queryForInt("SELECT AGE FROM CUSTMR WHERE ID = :id", parms);
  223. assertEquals("Return of an int", 22, i);
  224. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?");
  225. verify(preparedStatement).setObject(1, 3);
  226. }
  227. @Test
  228. public void testQueryForLongWithParamBean() throws Exception {
  229. given(resultSet.getMetaData()).willReturn(resultSetMetaData);
  230. given(resultSet.next()).willReturn(true, false);
  231. given(resultSet.getLong(1)).willReturn(87L);
  232. BeanPropertySqlParameterSource parms = new BeanPropertySqlParameterSource(
  233. new ParameterBean(3));
  234. long l = template.queryForLong("SELECT AGE FROM CUSTMR WHERE ID = :id", parms);
  235. assertEquals("Return of a long", 87, l);
  236. verify(connection).prepareStatement("SELECT AGE FROM CUSTMR WHERE ID = ?");
  237. verify(preparedStatement).setObject(1, 3, Types.INTEGER);
  238. }
  239. static class ParameterBean {
  240. private int id;
  241. public ParameterBean(int id) {
  242. this.id = id;
  243. }
  244. public int getId() {
  245. return id;
  246. }
  247. }
  248. }