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.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 }