1515 */
1616package examples .custom_render ;
1717
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 ;
1922import 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 ;
2130
31+ import java .sql .JDBCType ;
2232import java .util .List ;
2333import java .util .Map ;
2434import java .util .Optional ;
3242import org .junit .jupiter .api .BeforeAll ;
3343import org .junit .jupiter .api .BeforeEach ;
3444import org .junit .jupiter .api .Test ;
35- import org .mybatis .dynamic .sql .SqlBuilder ;
3645import 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 ;
3850import org .mybatis .dynamic .sql .render .RenderingStrategies ;
39- import org .mybatis .dynamic .sql .select .SelectDSLCompleter ;
4051import org .mybatis .dynamic .sql .select .render .SelectStatementProvider ;
52+ import org .mybatis .dynamic .sql .update .render .UpdateStatementProvider ;
4153import org .testcontainers .junit .jupiter .Container ;
4254import org .testcontainers .junit .jupiter .Testcontainers ;
4355
@@ -64,33 +76,105 @@ void resetDatabase() {
6476 try (SqlSession sqlSession = sqlSessionFactory .openSession ()) {
6577 JsonTestMapper mapper = sqlSession .getMapper (JsonTestMapper .class );
6678
67- mapper .delete (DeleteDSLCompleter .allRows ());
79+ DeleteStatementProvider deleteStatement = deleteFrom (jsonTest ).build ().render (RenderingStrategies .MYBATIS3 );
80+
81+ mapper .delete (deleteStatement );
6882 }
6983 }
7084
7185 @ Test
72- void testInsert () {
86+ void testInsertRecord () {
7387 try (SqlSession sqlSession = sqlSessionFactory .openSession ()) {
7488 JsonTestMapper mapper = sqlSession .getMapper (JsonTestMapper .class );
7589
7690 JsonTestRecord record = new JsonTestRecord ();
7791 record .setId (1 );
7892 record .setDescription ("Fred" );
7993 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 );
80107
81- int rows = mapper .insert (record );
108+ int rows = mapper .insert (insertStatement );
82109 assertThat (rows ).isEqualTo (1 );
83110
84111 record = new JsonTestRecord ();
85112 record .setId (2 );
86113 record .setDescription ("Wilma" );
87114 record .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
88115
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 );
90124 assertThat (rows ).isEqualTo (1 );
91125
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 );
94178 assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
95179 assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
96180 }
@@ -110,12 +194,34 @@ void testInsertMultiple() {
110194 record2 .setId (2 );
111195 record2 .setDescription ("Wilma" );
112196 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 );
113205
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 );
115215 assertThat (rows ).isEqualTo (2 );
116216
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 );
119225 assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
120226 assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
121227 }
@@ -136,17 +242,40 @@ void testUpdate() {
136242 record2 .setDescription ("Wilma" );
137243 record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
138244
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 );
140254 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}" ;
141265
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 );
146269 assertThat (rows ).isEqualTo (1 );
147270
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 );
150279 assertThat (records .get (0 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Fred\" , \" lastName\" : \" Flintstone\" , \" age\" : 30}" );
151280 assertThat (records .get (1 ).getInfo ()).isEqualTo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 26}" );
152281 }
@@ -167,11 +296,30 @@ void testDefererence() {
167296 record2 .setDescription ("Wilma" );
168297 record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
169298
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 );
171308 assertThat (rows ).isEqualTo (2 );
172309
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 );
175323
176324 assertThat (record ).hasValueSatisfying ( c ->
177325 c .getInfo ().equals ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" ));
@@ -193,22 +341,36 @@ void testDefererence2() {
193341 record2 .setDescription ("Wilma" );
194342 record2 .setInfo ("{\" firstName\" : \" Wilma\" , \" lastName\" : \" Flintstone\" , \" age\" : 25}" );
195343
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 );
197353 assertThat (rows ).isEqualTo (2 );
198354
199- SelectStatementProvider selectStatement = SqlBuilder . select (dereference (info , "firstName" ).as ("firstname" ))
355+ SelectStatementProvider selectStatement = select (dereference (info , "firstName" ).as ("firstname" ))
200356 .from (jsonTest )
201357 .where (dereference (info , "age" ), isEqualTo ("25" ))
202358 .build ()
203359 .render (RenderingStrategies .MYBATIS3 );
204360
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+
205367 List <Map <String , Object >> records = mapper .generalSelect (selectStatement );
206368 assertThat (records ).hasSize (1 );
207369 assertThat (records .get (0 )).containsEntry ("firstname" , "Wilma" );
208370 }
209371 }
210372
211373 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 );
213375 }
214376}
0 commit comments