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