1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }