View Javadoc
1   /*
2    *    Copyright 2016-2025 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    *       https://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 examples.postgres;
17  
18  import static examples.postgres.TableCodeDynamicSqlSupport.*;
19  import static org.assertj.core.api.Assertions.assertThat;
20  import static org.mybatis.dynamic.sql.SqlBuilder.*;
21  
22  import java.util.List;
23  import java.util.Map;
24  
25  import config.TestContainersConfiguration;
26  import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
27  import org.apache.ibatis.mapping.Environment;
28  import org.apache.ibatis.session.Configuration;
29  import org.apache.ibatis.session.SqlSession;
30  import org.apache.ibatis.session.SqlSessionFactory;
31  import org.apache.ibatis.session.SqlSessionFactoryBuilder;
32  import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
33  import org.junit.jupiter.api.BeforeAll;
34  import org.junit.jupiter.api.Test;
35  import org.mybatis.dynamic.sql.render.RenderingStrategies;
36  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
37  import org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper;
38  import org.testcontainers.containers.PostgreSQLContainer;
39  import org.testcontainers.junit.jupiter.Container;
40  import org.testcontainers.junit.jupiter.Testcontainers;
41  
42  @Testcontainers
43  class PostgresTest {
44  
45      @SuppressWarnings("resource")
46      @Container
47      private static final PostgreSQLContainer<?> postgres =
48              new PostgreSQLContainer<>(TestContainersConfiguration.POSTGRES_LATEST)
49                      .withInitScript("examples/postgres/dbInit.sql");
50  
51      private static SqlSessionFactory sqlSessionFactory;
52  
53      @BeforeAll
54      static void setUp() {
55          UnpooledDataSource ds = new UnpooledDataSource(postgres.getDriverClassName(), postgres.getJdbcUrl(),
56                  postgres.getUsername(), postgres.getPassword());
57          Environment environment = new Environment("test", new JdbcTransactionFactory(), ds);
58          Configuration configuration = new Configuration(environment);
59          configuration.addMapper(CommonSelectMapper.class);
60          sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
61      }
62  
63      @Test
64      void testSelectForUpdate() {
65          try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
66              CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
67  
68              SelectStatementProvider selectStatement = select(id, description)
69                      .from(tableCode)
70                      .orderBy(id)
71                      .forUpdate()
72                      .build()
73                      .render(RenderingStrategies.MYBATIS3);
74  
75              assertThat(selectStatement.getSelectStatement())
76                      .isEqualTo("select id, description from TableCode order by id for update");
77              List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
78              assertThat(records).hasSize(4);
79          }
80      }
81  
82      @Test
83      void testSelectForUpdateNoWait() {
84          try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
85              CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
86  
87              SelectStatementProvider selectStatement = select(id, description)
88                      .from(tableCode)
89                      .orderBy(id)
90                      .forUpdate()
91                      .nowait()
92                      .build()
93                      .render(RenderingStrategies.MYBATIS3);
94  
95              assertThat(selectStatement.getSelectStatement())
96                      .isEqualTo("select id, description from TableCode order by id for update nowait");
97              List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
98              assertThat(records).hasSize(4);
99          }
100     }
101 
102     @Test
103     void testSelectForUpdateSkipLocked() {
104         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
105             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
106 
107             SelectStatementProvider selectStatement = select(id, description)
108                     .from(tableCode)
109                     .orderBy(id)
110                     .forUpdate()
111                     .skipLocked()
112                     .build()
113                     .render(RenderingStrategies.MYBATIS3);
114 
115             assertThat(selectStatement.getSelectStatement())
116                     .isEqualTo("select id, description from TableCode order by id for update skip locked");
117             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
118             assertThat(records).hasSize(4);
119         }
120     }
121 
122     @Test
123     void testSelectForNoKeyUpdate() {
124         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
125             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
126 
127             SelectStatementProvider selectStatement = select(id, description)
128                     .from(tableCode)
129                     .orderBy(id)
130                     .forNoKeyUpdate()
131                     .build()
132                     .render(RenderingStrategies.MYBATIS3);
133 
134             assertThat(selectStatement.getSelectStatement())
135                     .isEqualTo("select id, description from TableCode order by id for no key update");
136             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
137             assertThat(records).hasSize(4);
138         }
139     }
140 
141     @Test
142     void testSelectForNoKeyUpdateNoWait() {
143         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
144             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
145 
146             SelectStatementProvider selectStatement = select(id, description)
147                     .from(tableCode)
148                     .orderBy(id)
149                     .forNoKeyUpdate()
150                     .nowait()
151                     .build()
152                     .render(RenderingStrategies.MYBATIS3);
153 
154             assertThat(selectStatement.getSelectStatement())
155                     .isEqualTo("select id, description from TableCode order by id for no key update nowait");
156             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
157             assertThat(records).hasSize(4);
158         }
159     }
160 
161     @Test
162     void testSelectForNoKeyUpdateSkipLocked() {
163         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
164             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
165 
166             SelectStatementProvider selectStatement = select(id, description)
167                     .from(tableCode)
168                     .orderBy(id)
169                     .forNoKeyUpdate()
170                     .skipLocked()
171                     .build()
172                     .render(RenderingStrategies.MYBATIS3);
173 
174             assertThat(selectStatement.getSelectStatement())
175                     .isEqualTo("select id, description from TableCode order by id for no key update skip locked");
176             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
177             assertThat(records).hasSize(4);
178         }
179     }
180 
181     @Test
182     void testSelectForShare() {
183         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
184             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
185 
186             SelectStatementProvider selectStatement = select(id, description)
187                     .from(tableCode)
188                     .orderBy(id)
189                     .forShare()
190                     .build()
191                     .render(RenderingStrategies.MYBATIS3);
192 
193             assertThat(selectStatement.getSelectStatement())
194                     .isEqualTo("select id, description from TableCode order by id for share");
195             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
196             assertThat(records).hasSize(4);
197         }
198     }
199 
200     @Test
201     void testSelectForShareNoWait() {
202         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
203             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
204 
205             SelectStatementProvider selectStatement = select(id, description)
206                     .from(tableCode)
207                     .orderBy(id)
208                     .forShare()
209                     .nowait()
210                     .build()
211                     .render(RenderingStrategies.MYBATIS3);
212 
213             assertThat(selectStatement.getSelectStatement())
214                     .isEqualTo("select id, description from TableCode order by id for share nowait");
215             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
216             assertThat(records).hasSize(4);
217         }
218     }
219 
220     @Test
221     void testSelectForShareSkipLocked() {
222         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
223             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
224 
225             SelectStatementProvider selectStatement = select(id, description)
226                     .from(tableCode)
227                     .orderBy(id)
228                     .forShare()
229                     .skipLocked()
230                     .build()
231                     .render(RenderingStrategies.MYBATIS3);
232 
233             assertThat(selectStatement.getSelectStatement())
234                     .isEqualTo("select id, description from TableCode order by id for share skip locked");
235             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
236             assertThat(records).hasSize(4);
237         }
238     }
239 
240     @Test
241     void testSelectForKeyShare() {
242         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
243             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
244 
245             SelectStatementProvider selectStatement = select(id, description)
246                     .from(tableCode)
247                     .orderBy(id)
248                     .forKeyShare()
249                     .build()
250                     .render(RenderingStrategies.MYBATIS3);
251 
252             assertThat(selectStatement.getSelectStatement())
253                     .isEqualTo("select id, description from TableCode order by id for key share");
254             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
255             assertThat(records).hasSize(4);
256         }
257     }
258 
259     @Test
260     void testSelectForKeyShareNoWait() {
261         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
262             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
263 
264             SelectStatementProvider selectStatement = select(id, description)
265                     .from(tableCode)
266                     .orderBy(id)
267                     .forKeyShare()
268                     .nowait()
269                     .build()
270                     .render(RenderingStrategies.MYBATIS3);
271 
272             assertThat(selectStatement.getSelectStatement())
273                     .isEqualTo("select id, description from TableCode order by id for key share nowait");
274             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
275             assertThat(records).hasSize(4);
276         }
277     }
278 
279     @Test
280     void testSelectForKeyShareSkipLocked() {
281         try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
282             CommonSelectMapper mapper = sqlSession.getMapper(CommonSelectMapper.class);
283 
284             SelectStatementProvider selectStatement = select(id, description)
285                     .from(tableCode)
286                     .orderBy(id)
287                     .forKeyShare()
288                     .skipLocked()
289                     .build()
290                     .render(RenderingStrategies.MYBATIS3);
291 
292             assertThat(selectStatement.getSelectStatement())
293                     .isEqualTo("select id, description from TableCode order by id for key share skip locked");
294             List<Map<String, Object>> records = mapper.selectManyMappedRows(selectStatement);
295             assertThat(records).hasSize(4);
296         }
297     }
298 }