Skip to content

Commit 905133e

Browse files
committed
Merge branch 'sivdead-master'
2 parents b9742dd + f65f9ec commit 905133e

File tree

2 files changed

+81
-7
lines changed

2 files changed

+81
-7
lines changed

src/main/java/org/apache/ibatis/jdbc/AbstractSQL.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ public T INSERT_INTO(String tableName) {
6161
}
6262

6363
public T VALUES(String columns, String values) {
64-
sql().columns.add(columns);
65-
sql().values.add(values);
64+
INTO_COLUMNS(columns);
65+
INTO_VALUES(values);
6666
return getSelf();
6767
}
6868

@@ -78,7 +78,10 @@ public T INTO_COLUMNS(String... columns) {
7878
* @since 3.4.2
7979
*/
8080
public T INTO_VALUES(String... values) {
81-
sql().values.addAll(Arrays.asList(values));
81+
List<String> list = sql().valuesList.get(sql().valuesList.size() - 1);
82+
for (String value : values) {
83+
list.add(value);
84+
}
8285
return getSelf();
8386
}
8487

@@ -310,6 +313,16 @@ public T OFFSET(long value) {
310313
return getSelf();
311314
}
312315

316+
/**
317+
* used to add a new inserted row while do multi-row insert.
318+
*
319+
* @since 3.5.2
320+
*/
321+
public T ADD_ROW() {
322+
sql().valuesList.add(new ArrayList<>());
323+
return getSelf();
324+
}
325+
313326
private SQLStatement sql() {
314327
return sql;
315328
}
@@ -374,13 +387,14 @@ public enum StatementType {
374387
List<String> orderBy = new ArrayList<>();
375388
List<String> lastList = new ArrayList<>();
376389
List<String> columns = new ArrayList<>();
377-
List<String> values = new ArrayList<>();
390+
List<List<String>> valuesList = new ArrayList<>();
378391
boolean distinct;
379392
String offset;
380393
String limit;
381394

382395
public SQLStatement() {
383-
// Prevent Synthetic Access
396+
// Prevent Synthetic Access
397+
valuesList.add(new ArrayList<>());
384398
}
385399

386400
private void sqlClause(SafeAppendable builder, String keyword, List<String> parts, String open, String close,
@@ -438,7 +452,9 @@ private void joins(SafeAppendable builder) {
438452
private String insertSQL(SafeAppendable builder) {
439453
sqlClause(builder, "INSERT INTO", tables, "", "", "");
440454
sqlClause(builder, "", columns, "(", ")", ", ");
441-
sqlClause(builder, "VALUES", values, "(", ")", ", ");
455+
for (int i = 0; i < valuesList.size(); i++) {
456+
sqlClause(builder, i > 0 ? "," : "VALUES", valuesList.get(i), "(", ")", ", ");
457+
}
442458
return builder.toString();
443459
}
444460

@@ -494,4 +510,4 @@ public String sql(Appendable a) {
494510
return answer;
495511
}
496512
}
497-
}
513+
}

src/test/java/org/apache/ibatis/jdbc/SQLTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,62 @@ void deleteUsingLimit() {
347347
assertEquals("DELETE FROM test\nWHERE (status = #{status}) LIMIT 20", sql);
348348
}
349349

350+
@Test
351+
void supportBatchInsert(){
352+
final String sql = new SQL(){{
353+
INSERT_INTO("table1 a");
354+
INTO_COLUMNS("col1,col2");
355+
INTO_VALUES("val1","val2");
356+
ADD_ROW();
357+
INTO_VALUES("val1","val2");
358+
}}.toString();
359+
360+
assertThat(sql).isEqualToIgnoringWhitespace("INSERT INTO table1 a (col1,col2) VALUES (val1,val2), (val1,val2)");
361+
}
362+
363+
@Test
364+
void singleInsert() {
365+
final String sql = new SQL() {{
366+
INSERT_INTO("table1 a");
367+
INTO_COLUMNS("col1,col2");
368+
INTO_VALUES("val1", "val2");
369+
}}.toString();
370+
371+
assertThat(sql).isEqualToIgnoringWhitespace("INSERT INTO table1 a (col1,col2) VALUES (val1,val2)");
372+
}
373+
374+
@Test
375+
void singleInsertWithMultipleInsertValues() {
376+
final String sql = new SQL() {{
377+
INSERT_INTO("TABLE_A").INTO_COLUMNS("a", "b").INTO_VALUES("#{a}").INTO_VALUES("#{b}");
378+
}}.toString();
379+
380+
assertThat(sql).isEqualToIgnoringWhitespace("INSERT INTO TABLE_A (a, b) VALUES (#{a}, #{b})");
381+
}
382+
383+
@Test
384+
void batchInsertWithMultipleInsertValues() {
385+
final String sql = new SQL() {{
386+
INSERT_INTO("TABLE_A");
387+
INTO_COLUMNS("a", "b");
388+
INTO_VALUES("#{a1}");
389+
INTO_VALUES("#{b1}");
390+
ADD_ROW();
391+
INTO_VALUES("#{a2}");
392+
INTO_VALUES("#{b2}");
393+
}}.toString();
394+
395+
assertThat(sql).isEqualToIgnoringWhitespace("INSERT INTO TABLE_A (a, b) VALUES (#{a1}, #{b1}), (#{a2}, #{b2})");
396+
}
397+
398+
@Test
399+
void testValues() {
400+
final String sql = new SQL() {{
401+
INSERT_INTO("PERSON");
402+
VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");
403+
VALUES("LAST_NAME", "#{lastName}");
404+
}}.toString();
405+
406+
assertThat(sql).isEqualToIgnoringWhitespace("INSERT INTO PERSON (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})");
407+
}
350408
}

0 commit comments

Comments
 (0)