Skip to content

Commit 2b9f814

Browse files
committed
Start of Map To Row
1 parent 3a354f9 commit 2b9f814

File tree

10 files changed

+154
-1
lines changed

10 files changed

+154
-1
lines changed

src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertDSL.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.mybatis.dynamic.sql.util.ConstantMapping;
2929
import org.mybatis.dynamic.sql.util.NullMapping;
3030
import org.mybatis.dynamic.sql.util.PropertyMapping;
31+
import org.mybatis.dynamic.sql.util.RowMapping;
3132
import org.mybatis.dynamic.sql.util.StringConstantMapping;
3233

3334
public class MultiRowInsertDSL<T> implements Buildable<MultiRowInsertModel<T>> {
@@ -102,6 +103,11 @@ public MultiRowInsertDSL<T> toStringConstant(String constant) {
102103
columnMappings.add(StringConstantMapping.of(column, constant));
103104
return MultiRowInsertDSL.this;
104105
}
106+
107+
public MultiRowInsertDSL<T> toRow() {
108+
columnMappings.add(RowMapping.of(column));
109+
return MultiRowInsertDSL.this;
110+
}
105111
}
106112

107113
public static class Builder<T> extends BatchInsertDSL.AbstractBuilder<T, Builder<T>> {

src/main/java/org/mybatis/dynamic/sql/insert/render/AbstractMultiRowValuePhraseVisitor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
import org.mybatis.dynamic.sql.SqlColumn;
1919
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2020
import org.mybatis.dynamic.sql.util.ConstantMapping;
21+
import org.mybatis.dynamic.sql.util.Messages;
2122
import org.mybatis.dynamic.sql.util.MultiRowInsertMappingVisitor;
2223
import org.mybatis.dynamic.sql.util.NullMapping;
2324
import org.mybatis.dynamic.sql.util.PropertyMapping;
25+
import org.mybatis.dynamic.sql.util.RowMapping;
2426
import org.mybatis.dynamic.sql.util.StringConstantMapping;
2527

2628
public abstract class AbstractMultiRowValuePhraseVisitor
@@ -62,5 +64,11 @@ public FieldAndValueAndParameters visit(PropertyMapping mapping) {
6264
.build();
6365
}
6466

67+
@Override
68+
public FieldAndValueAndParameters visit(RowMapping mapping) {
69+
// TODO - fix error number
70+
throw new UnsupportedOperationException(Messages.getInternalErrorString(99));
71+
}
72+
6573
abstract String calculateJdbcPlaceholder(SqlColumn<?> column, String parameterName);
6674
}

src/main/java/org/mybatis/dynamic/sql/insert/render/MultiRowValuePhraseVisitor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
import org.mybatis.dynamic.sql.SqlColumn;
1919
import org.mybatis.dynamic.sql.render.RenderingStrategy;
20+
import org.mybatis.dynamic.sql.util.Messages;
21+
import org.mybatis.dynamic.sql.util.RowMapping;
22+
23+
import java.util.Optional;
2024

2125
public class MultiRowValuePhraseVisitor extends AbstractMultiRowValuePhraseVisitor {
2226

@@ -29,4 +33,10 @@ String calculateJdbcPlaceholder(SqlColumn<?> column, String parameterName) {
2933
return column.renderingStrategy().orElse(renderingStrategy)
3034
.getMultiRowFormattedJdbcPlaceholder(column, prefix, parameterName);
3135
}
36+
37+
@Override
38+
public FieldAndValueAndParameters visit(RowMapping mapping) {
39+
// TODO - fix error number, and move this somewhere up in the hierarchy
40+
throw new UnsupportedOperationException(Messages.getInternalErrorString(99));
41+
}
3242
}

src/main/java/org/mybatis/dynamic/sql/insert/render/ValuePhraseVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2222
import org.mybatis.dynamic.sql.util.ConstantMapping;
2323
import org.mybatis.dynamic.sql.util.InsertMappingVisitor;
24+
import org.mybatis.dynamic.sql.util.Messages;
2425
import org.mybatis.dynamic.sql.util.NullMapping;
2526
import org.mybatis.dynamic.sql.util.PropertyMapping;
2627
import org.mybatis.dynamic.sql.util.PropertyWhenPresentMapping;
28+
import org.mybatis.dynamic.sql.util.RowMapping;
2729
import org.mybatis.dynamic.sql.util.StringConstantMapping;
2830

2931
public class ValuePhraseVisitor extends InsertMappingVisitor<Optional<FieldAndValueAndParameters>> {

src/main/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,7 @@ public interface ColumnMappingVisitor<R> {
4949

5050
R visit(PropertyWhenPresentMapping mapping);
5151

52-
R visit(ColumnToColumnMapping columnMapping);
52+
R visit(ColumnToColumnMapping mapping);
53+
54+
R visit(RowMapping mapping);
5355
}

src/main/java/org/mybatis/dynamic/sql/util/GeneralInsertMappingVisitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,10 @@ public final R visit(PropertyWhenPresentMapping mapping) {
3535
public final R visit(ColumnToColumnMapping columnMapping) {
3636
throw new UnsupportedOperationException(Messages.getInternalErrorString(4));
3737
}
38+
39+
@Override
40+
public final R visit(RowMapping mapping) {
41+
// TODO - fix error number
42+
throw new UnsupportedOperationException(Messages.getInternalErrorString(99));
43+
}
3844
}

src/main/java/org/mybatis/dynamic/sql/util/InsertMappingVisitor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
*/
1616
package org.mybatis.dynamic.sql.util;
1717

18+
import org.mybatis.dynamic.sql.insert.render.FieldAndValueAndParameters;
19+
20+
import java.util.Optional;
21+
1822
public abstract class InsertMappingVisitor<R> implements ColumnMappingVisitor<R> {
1923
@Override
2024
public final <T> R visit(ValueMapping<T> mapping) {
@@ -40,4 +44,10 @@ public final R visit(SelectMapping mapping) {
4044
public final R visit(ColumnToColumnMapping columnMapping) {
4145
throw new UnsupportedOperationException(Messages.getInternalErrorString(9));
4246
}
47+
48+
@Override
49+
public R visit(RowMapping mapping) {
50+
// TODO - fix error number
51+
throw new UnsupportedOperationException(Messages.getInternalErrorString(99));
52+
}
4353
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2016-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.util;
17+
18+
import org.mybatis.dynamic.sql.SqlColumn;
19+
20+
public class RowMapping extends AbstractColumnMapping {
21+
private RowMapping(SqlColumn<?> column) {
22+
super(column);
23+
}
24+
25+
public static RowMapping of(SqlColumn<?> column) {
26+
return new RowMapping(column);
27+
}
28+
29+
@Override
30+
public <R> R accept(ColumnMappingVisitor<R> visitor) {
31+
return visitor.visit(this);
32+
}
33+
}

src/main/java/org/mybatis/dynamic/sql/util/UpdateMappingVisitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,10 @@ public final R visit(PropertyMapping mapping) {
2525
public final R visit(PropertyWhenPresentMapping mapping) {
2626
throw new UnsupportedOperationException(Messages.getInternalErrorString(11));
2727
}
28+
29+
@Override
30+
public final R visit(RowMapping mapping) {
31+
// TODO - fix error number
32+
throw new UnsupportedOperationException(Messages.getInternalErrorString(99));
33+
}
2834
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.mybatis.dynamic.sql.insert;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mybatis.dynamic.sql.SqlBuilder.insert;
5+
import static org.mybatis.dynamic.sql.SqlBuilder.insertMultiple;
6+
7+
import java.sql.JDBCType;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
import org.junit.jupiter.api.Test;
12+
import org.mybatis.dynamic.sql.SqlColumn;
13+
import org.mybatis.dynamic.sql.SqlTable;
14+
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
15+
import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider;
16+
import org.mybatis.dynamic.sql.render.RenderingStrategies;
17+
class MapToRowTest {
18+
private static final SqlTable foo = SqlTable.of("foo");
19+
private static final SqlColumn<Integer> id1 = foo.column("id1", JDBCType.INTEGER);
20+
private static final SqlColumn<Integer> id2 = foo.column("id2", JDBCType.INTEGER);
21+
22+
@Test
23+
void testBasicInsertMultipleWithMyBatis() {
24+
class Record {
25+
public Record() {}
26+
27+
public Record(Integer id1, Integer id2) {
28+
this.id1 = id1;
29+
this.id2 = id2;
30+
}
31+
32+
public Integer id1;
33+
public Integer id2;
34+
}
35+
36+
List<Record> records = new ArrayList<>();
37+
records.add(new Record(33, 1));
38+
records.add(new Record(33, 2));
39+
records.add(new Record(33, 3));
40+
41+
42+
MultiRowInsertStatementProvider<Record> insertStatement = insertMultiple(records)
43+
.into(foo)
44+
.map(id1).toConstant("22")
45+
.map(id2).toProperty("id2")
46+
.build()
47+
.render(RenderingStrategies.MYBATIS3);
48+
49+
String expected = "insert into foo (id1, id2) values (22, #{records[0].id2,jdbcType=INTEGER}), (22, #{records[1].id2,jdbcType=INTEGER}), (22, #{records[2].id2,jdbcType=INTEGER})";
50+
assertThat(insertStatement.getInsertStatement()).isEqualTo(expected);
51+
}
52+
53+
@Test
54+
void testBasicInsertMultipleRowMappingWithMyBatis() {
55+
List<Integer> integers = new ArrayList<>();
56+
integers.add(1);
57+
integers.add(2);
58+
integers.add(3);
59+
60+
MultiRowInsertStatementProvider<Integer> insertStatement = insertMultiple(integers)
61+
.into(foo)
62+
.map(id1).toConstant("22")
63+
.map(id2).toRow()
64+
.build()
65+
.render(RenderingStrategies.MYBATIS3);
66+
67+
String expected = "insert into foo (id1, id2) values (22, #{records[0],jdbcType=INTEGER}), (22, #{records[1],jdbcType=INTEGER}), (22, #{records[2],jdbcType=INTEGER})";
68+
assertThat(insertStatement.getInsertStatement()).isEqualTo(expected);
69+
}
70+
}

0 commit comments

Comments
 (0)