View Javadoc
1   /*
2    *    Copyright 2009-2021 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.apache.ibatis.submitted.refcursor;
17  
18  import static org.junit.jupiter.api.Assertions.*;
19  
20  import java.util.ArrayList;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.apache.ibatis.BaseDataTest;
26  import org.apache.ibatis.mapping.Environment;
27  import org.apache.ibatis.session.Configuration;
28  import org.apache.ibatis.session.ResultContext;
29  import org.apache.ibatis.session.ResultHandler;
30  import org.apache.ibatis.session.SqlSession;
31  import org.apache.ibatis.session.SqlSessionFactory;
32  import org.apache.ibatis.session.SqlSessionFactoryBuilder;
33  import org.apache.ibatis.testcontainers.PgContainer;
34  import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
35  import org.junit.jupiter.api.BeforeAll;
36  import org.junit.jupiter.api.Tag;
37  import org.junit.jupiter.api.Test;
38  
39  /**
40   * @author Jeff Butler
41   */
42  @Tag("TestcontainersTests")
43  class RefCursorTest {
44  
45    private static SqlSessionFactory sqlSessionFactory;
46  
47    @BeforeAll
48    static void setUp() throws Exception {
49      Configuration configuration = new Configuration();
50      Environment environment = new Environment("development", new JdbcTransactionFactory(),
51          PgContainer.getUnpooledDataSource());
52      configuration.setEnvironment(environment);
53      configuration.addMapper(OrdersMapper.class);
54      sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
55  
56      BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),
57          "org/apache/ibatis/submitted/refcursor/CreateDB.sql");
58    }
59  
60    @Test
61    void testRefCursor1() {
62      try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
63        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
64        Map<String, Object> parameter = new HashMap<>();
65        parameter.put("orderId", 1);
66        mapper.getOrder1(parameter);
67  
68        assertNotNull(parameter.get("order"));
69        @SuppressWarnings("unchecked")
70        List<Order> orders = (List<Order>) parameter.get("order");
71        assertEquals(1, orders.size());
72        Order order = orders.get(0);
73        assertEquals(3, order.getDetailLines().size());
74      }
75    }
76  
77    @Test
78    void testRefCursor2() {
79      try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
80        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
81        Map<String, Object> parameter = new HashMap<>();
82        parameter.put("orderId", 1);
83        mapper.getOrder2(parameter);
84  
85        assertNotNull(parameter.get("order"));
86        @SuppressWarnings("unchecked")
87        List<Order> orders = (List<Order>) parameter.get("order");
88        assertEquals(1, orders.size());
89        Order order = orders.get(0);
90        assertEquals(3, order.getDetailLines().size());
91      }
92    }
93  
94    @Test
95    void shouldUseResultHandlerOnOutputParam() {
96      class OrderResultHandler implements ResultHandler<Order> {
97        private List<Order> orders = new ArrayList<>();
98  
99        @Override
100       public void handleResult(ResultContext<? extends Order> resultContext) {
101         Order order = resultContext.getResultObject();
102         order.setCustomerName("Anonymous");
103         orders.add(order);
104       }
105 
106       List<Order> getResult() {
107         return orders;
108       }
109     }
110 
111     try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
112       OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
113       OrderResultHandler handler = new OrderResultHandler();
114       Map<String, Object> parameter = new HashMap<>();
115       parameter.put("orderId", 1);
116       mapper.getOrder3(parameter, handler);
117 
118       assertNull(parameter.get("order"));
119       assertEquals(3, parameter.get("detailCount"));
120       assertEquals("Anonymous", handler.getResult().get(0).getCustomerName());
121     }
122   }
123 
124   @Test
125   void shouldNullResultSetNotCauseNpe() {
126     try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
127       OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
128       Map<String, Object> parameter = new HashMap<>();
129       parameter.put("orderId", 99);
130       mapper.getOrder3(parameter, resultContext -> {
131         // won't be used
132       });
133       assertEquals(0, parameter.get("detailCount"));
134     }
135   }
136 }