15
15
*/
16
16
package examples .custom_render ;
17
17
18
- import static examples .custom_render .JsonTestDynamicSqlSupport .*;
18
+ import static examples .custom_render .JsonTestDynamicSqlSupport .description ;
19
+ import static examples .custom_render .JsonTestDynamicSqlSupport .id ;
20
+ import static examples .custom_render .JsonTestDynamicSqlSupport .info ;
21
+ import static examples .custom_render .JsonTestDynamicSqlSupport .jsonTest ;
19
22
import static org .assertj .core .api .Assertions .assertThat ;
20
- import static org .mybatis .dynamic .sql .SqlBuilder .*;
23
+ import static org .mybatis .dynamic .sql .SqlBuilder .deleteFrom ;
24
+ import static org .mybatis .dynamic .sql .SqlBuilder .insert ;
25
+ import static org .mybatis .dynamic .sql .SqlBuilder .insertInto ;
26
+ import static org .mybatis .dynamic .sql .SqlBuilder .insertMultiple ;
27
+ import static org .mybatis .dynamic .sql .SqlBuilder .isEqualTo ;
28
+ import static org .mybatis .dynamic .sql .SqlBuilder .select ;
29
+ import static org .mybatis .dynamic .sql .SqlBuilder .update ;
21
30
31
+ import java .sql .JDBCType ;
22
32
import java .util .List ;
23
33
import java .util .Map ;
24
34
import java .util .Optional ;
32
42
import org .junit .jupiter .api .BeforeAll ;
33
43
import org .junit .jupiter .api .BeforeEach ;
34
44
import org .junit .jupiter .api .Test ;
35
- import org .mybatis .dynamic .sql .SqlBuilder ;
36
45
import org .mybatis .dynamic .sql .SqlColumn ;
37
- import org .mybatis .dynamic .sql .delete .DeleteDSLCompleter ;
46
+ import org .mybatis .dynamic .sql .delete .render .DeleteStatementProvider ;
47
+ import org .mybatis .dynamic .sql .insert .render .GeneralInsertStatementProvider ;
48
+ import org .mybatis .dynamic .sql .insert .render .InsertStatementProvider ;
49
+ import org .mybatis .dynamic .sql .insert .render .MultiRowInsertStatementProvider ;
38
50
import org .mybatis .dynamic .sql .render .RenderingStrategies ;
39
- import org .mybatis .dynamic .sql .select .SelectDSLCompleter ;
40
51
import org .mybatis .dynamic .sql .select .render .SelectStatementProvider ;
52
+ import org .mybatis .dynamic .sql .update .render .UpdateStatementProvider ;
41
53
import org .testcontainers .junit .jupiter .Container ;
42
54
import org .testcontainers .junit .jupiter .Testcontainers ;
43
55
@@ -64,33 +76,105 @@ void resetDatabase() {
64
76
try (SqlSession sqlSession = sqlSessionFactory .openSession ()) {
65
77
JsonTestMapper mapper = sqlSession .getMapper (JsonTestMapper .class );
66
78
67
- mapper .delete (DeleteDSLCompleter .allRows ());
79
+ DeleteStatementProvider deleteStatement = deleteFrom (jsonTest ).build ().render (RenderingStrategies .MYBATIS3 );
80
+
81
+ mapper .delete (deleteStatement );
68
82
}
69
83
}
70
84
71
85
@ Test
72
- void testInsert () {
86
+ void testInsertRecord () {
73
87
try (SqlSession sqlSession = sqlSessionFactory .openSession ()) {
74
88
JsonTestMapper mapper = sqlSession .getMapper (JsonTestMapper .class );
75
89
76
90
JsonTestRecord record = new JsonTestRecord ();
77
91
record .setId (1 );
78
92
record .setDescription ("Fred" );
79
93
record .setInfo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
94
+
95
+ InsertStatementProvider <JsonTestRecord > insertStatement = insert (record ).into (jsonTest )
96
+ .map (id ).toProperty ("id" )
97
+ .map (description ).toProperty ("description" )
98
+ .map (info ).toProperty ("info" )
99
+ .build ()
100
+ .render (RenderingStrategies .MYBATIS3 );
101
+
102
+ String expected = "insert into JsonTest (id, description, info) "
103
+ + "values (#{record.id,jdbcType=INTEGER}, #{record.description,jdbcType=VARCHAR}, "
104
+ + "#{record.info,jdbcType=VARCHAR}::json)" ;
105
+
106
+ assertThat (insertStatement .getInsertStatement ()).isEqualTo (expected );
80
107
81
- int rows = mapper .insert (record );
108
+ int rows = mapper .insert (insertStatement );
82
109
assertThat (rows ).isEqualTo (1 );
83
110
84
111
record = new JsonTestRecord ();
85
112
record .setId (2 );
86
113
record .setDescription ("Wilma" );
87
114
record .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
88
115
89
- rows = mapper .insert (record );
116
+ insertStatement = insert (record ).into (jsonTest )
117
+ .map (id ).toProperty ("id" )
118
+ .map (description ).toProperty ("description" )
119
+ .map (info ).toProperty ("info" )
120
+ .build ()
121
+ .render (RenderingStrategies .MYBATIS3 );
122
+
123
+ rows = mapper .insert (insertStatement );
90
124
assertThat (rows ).isEqualTo (1 );
91
125
92
- List <JsonTestRecord > records = mapper .selectMany (SelectDSLCompleter .allRowsOrderedBy (id ));
93
- assertThat (records .size ()).isEqualTo (2 );
126
+ SelectStatementProvider selectStatement = select (id , description , info )
127
+ .from (jsonTest )
128
+ .orderBy (id )
129
+ .build ()
130
+ .render (RenderingStrategies .MYBATIS3 );
131
+
132
+ List <JsonTestRecord > records = mapper .selectMany (selectStatement );
133
+ assertThat (records ).hasSize (2 );
134
+ assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
135
+ assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
136
+ }
137
+ }
138
+
139
+ @ Test
140
+ void testGeneralInsert () {
141
+ try (SqlSession sqlSession = sqlSessionFactory .openSession ()) {
142
+ JsonTestMapper mapper = sqlSession .getMapper (JsonTestMapper .class );
143
+
144
+ GeneralInsertStatementProvider insertStatement = insertInto (jsonTest )
145
+ .set (id ).toValue (1 )
146
+ .set (description ).toValue ("Fred" )
147
+ .set (info ).toValue ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" )
148
+ .build ()
149
+ .render (RenderingStrategies .MYBATIS3 );
150
+
151
+ String expected = "insert into JsonTest (id, description, info) "
152
+ + "values (#{parameters.p1,jdbcType=INTEGER}, #{parameters.p2,jdbcType=VARCHAR}, "
153
+ + "#{parameters.p3,jdbcType=VARCHAR}::json)" ;
154
+
155
+ assertThat (insertStatement .getInsertStatement ()).isEqualTo (expected );
156
+
157
+ int rows = mapper .generalInsert (insertStatement );
158
+ assertThat (rows ).isEqualTo (1 );
159
+
160
+ insertStatement = insertInto (jsonTest )
161
+ .set (id ).toValue (2 )
162
+ .set (description ).toValue ("Wilma" )
163
+ .set (info ).toValue ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" )
164
+ .build ()
165
+ .render (RenderingStrategies .MYBATIS3 );
166
+
167
+ rows = mapper .generalInsert (insertStatement );
168
+ assertThat (rows ).isEqualTo (1 );
169
+
170
+ SelectStatementProvider selectStatement = select (id , description , info )
171
+ .from (jsonTest )
172
+ .orderBy (id )
173
+ .build ()
174
+ .render (RenderingStrategies .MYBATIS3 );
175
+
176
+ List <JsonTestRecord > records = mapper .selectMany (selectStatement );
177
+ assertThat (records ).hasSize (2 );
94
178
assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
95
179
assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
96
180
}
@@ -110,12 +194,34 @@ void testInsertMultiple() {
110
194
record2 .setId (2 );
111
195
record2 .setDescription ("Wilma" );
112
196
record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
197
+
198
+ MultiRowInsertStatementProvider <JsonTestRecord > insertStatement = insertMultiple (record1 , record2 )
199
+ .into (jsonTest )
200
+ .map (id ).toProperty ("id" )
201
+ .map (description ).toProperty ("description" )
202
+ .map (info ).toProperty ("info" )
203
+ .build ()
204
+ .render (RenderingStrategies .MYBATIS3 );
113
205
114
- int rows = mapper .insertMultiple (record1 , record2 );
206
+ String expected = "insert into JsonTest (id, description, info) "
207
+ + "values (#{records[0].id,jdbcType=INTEGER}, #{records[0].description,jdbcType=VARCHAR}, "
208
+ + "#{records[0].info,jdbcType=VARCHAR}::json), "
209
+ + "(#{records[1].id,jdbcType=INTEGER}, #{records[1].description,jdbcType=VARCHAR}, "
210
+ + "#{records[1].info,jdbcType=VARCHAR}::json)" ;
211
+
212
+ assertThat (insertStatement .getInsertStatement ()).isEqualTo (expected );
213
+
214
+ int rows = mapper .insertMultiple (insertStatement );
115
215
assertThat (rows ).isEqualTo (2 );
116
216
117
- List <JsonTestRecord > records = mapper .selectMany (SelectDSLCompleter .allRowsOrderedBy (id ));
118
- assertThat (records .size ()).isEqualTo (2 );
217
+ SelectStatementProvider selectStatement = select (id , description , info )
218
+ .from (jsonTest )
219
+ .orderBy (id )
220
+ .build ()
221
+ .render (RenderingStrategies .MYBATIS3 );
222
+
223
+ List <JsonTestRecord > records = mapper .selectMany (selectStatement );
224
+ assertThat (records ).hasSize (2 );
119
225
assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
120
226
assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
121
227
}
@@ -136,17 +242,40 @@ void testUpdate() {
136
242
record2 .setDescription ("Wilma" );
137
243
record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
138
244
139
- int rows = mapper .insertMultiple (record1 , record2 );
245
+ MultiRowInsertStatementProvider <JsonTestRecord > insertStatement = insertMultiple (record1 , record2 )
246
+ .into (jsonTest )
247
+ .map (id ).toProperty ("id" )
248
+ .map (description ).toProperty ("description" )
249
+ .map (info ).toProperty ("info" )
250
+ .build ()
251
+ .render (RenderingStrategies .MYBATIS3 );
252
+
253
+ int rows = mapper .insertMultiple (insertStatement );
140
254
assertThat (rows ).isEqualTo (2 );
255
+
256
+ UpdateStatementProvider updateStatement = update (jsonTest )
257
+ .set (info ).equalTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 26}" )
258
+ .where (id , isEqualTo (2 ))
259
+ .build ()
260
+ .render (RenderingStrategies .MYBATIS3 );
261
+
262
+ String expected = "update JsonTest "
263
+ + "set info = #{parameters.p1,jdbcType=VARCHAR}::json "
264
+ + "where id = #{parameters.p2,jdbcType=INTEGER}" ;
141
265
142
- rows = mapper .update (c ->
143
- c .set (info ).equalTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 26}" )
144
- .where (id , isEqualTo (2 ))
145
- );
266
+ assertThat (updateStatement .getUpdateStatement ()).isEqualTo (expected );
267
+
268
+ rows = mapper .update (updateStatement );
146
269
assertThat (rows ).isEqualTo (1 );
147
270
148
- List <JsonTestRecord > records = mapper .selectMany (SelectDSLCompleter .allRowsOrderedBy (id ));
149
- assertThat (records .size ()).isEqualTo (2 );
271
+ SelectStatementProvider selectStatement = select (id , description , info )
272
+ .from (jsonTest )
273
+ .orderBy (id )
274
+ .build ()
275
+ .render (RenderingStrategies .MYBATIS3 );
276
+
277
+ List <JsonTestRecord > records = mapper .selectMany (selectStatement );
278
+ assertThat (records ).hasSize (2 );
150
279
assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
151
280
assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 26}" );
152
281
}
@@ -167,11 +296,30 @@ void testDefererence() {
167
296
record2 .setDescription ("Wilma" );
168
297
record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
169
298
170
- int rows = mapper .insertMultiple (record1 , record2 );
299
+ MultiRowInsertStatementProvider <JsonTestRecord > insertStatement = insertMultiple (record1 , record2 )
300
+ .into (jsonTest )
301
+ .map (id ).toProperty ("id" )
302
+ .map (description ).toProperty ("description" )
303
+ .map (info ).toProperty ("info" )
304
+ .build ()
305
+ .render (RenderingStrategies .MYBATIS3 );
306
+
307
+ int rows = mapper .insertMultiple (insertStatement );
171
308
assertThat (rows ).isEqualTo (2 );
172
309
173
- Optional <JsonTestRecord > record = mapper .selectOne (c ->
174
- c .where (dereference (info , "age" ), isEqualTo ("25" )));
310
+ SelectStatementProvider selectStatement = select (id , description , info )
311
+ .from (jsonTest )
312
+ .where (dereference (info , "age" ), isEqualTo ("25" ))
313
+ .build ()
314
+ .render (RenderingStrategies .MYBATIS3 );
315
+
316
+ String expected = "select id, description, info "
317
+ + "from JsonTest "
318
+ + "where info->>'age' = #{parameters.p1,jdbcType=VARCHAR}" ;
319
+
320
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
321
+
322
+ Optional <JsonTestRecord > record = mapper .selectOne (selectStatement );
175
323
176
324
assertThat (record ).hasValueSatisfying ( c ->
177
325
c .getInfo ().equals ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" ));
@@ -193,22 +341,36 @@ void testDefererence2() {
193
341
record2 .setDescription ("Wilma" );
194
342
record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
195
343
196
- int rows = mapper .insertMultiple (record1 , record2 );
344
+ MultiRowInsertStatementProvider <JsonTestRecord > insertStatement = insertMultiple (record1 , record2 )
345
+ .into (jsonTest )
346
+ .map (id ).toProperty ("id" )
347
+ .map (description ).toProperty ("description" )
348
+ .map (info ).toProperty ("info" )
349
+ .build ()
350
+ .render (RenderingStrategies .MYBATIS3 );
351
+
352
+ int rows = mapper .insertMultiple (insertStatement );
197
353
assertThat (rows ).isEqualTo (2 );
198
354
199
- SelectStatementProvider selectStatement = SqlBuilder . select (dereference (info , "firstName" ).as ("firstname" ))
355
+ SelectStatementProvider selectStatement = select (dereference (info , "firstName" ).as ("firstname" ))
200
356
.from (jsonTest )
201
357
.where (dereference (info , "age" ), isEqualTo ("25" ))
202
358
.build ()
203
359
.render (RenderingStrategies .MYBATIS3 );
204
360
361
+ String expected = "select info->>'firstName' as firstname "
362
+ + "from JsonTest "
363
+ + "where info->>'age' = #{parameters.p1,jdbcType=VARCHAR}" ;
364
+
365
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
366
+
205
367
List <Map <String , Object >> records = mapper .generalSelect (selectStatement );
206
368
assertThat (records ).hasSize (1 );
207
369
assertThat (records .get (0 )).containsEntry ("firstname" , "Wilma" );
208
370
}
209
371
}
210
372
211
373
private <T > SqlColumn <String > dereference (SqlColumn <T > column , String attribute ) {
212
- return SqlColumn .of (column .name () + "->>'" + attribute + "'" , column .table ());
374
+ return SqlColumn .of (column .name () + "->>'" + attribute + "'" , column .table (), JDBCType . VARCHAR );
213
375
}
214
376
}
0 commit comments