1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.insert.render;
17
18 import org.mybatis.dynamic.sql.SqlColumn;
19 import org.mybatis.dynamic.sql.render.RenderingStrategy;
20 import org.mybatis.dynamic.sql.util.ConstantMapping;
21 import org.mybatis.dynamic.sql.util.MultiRowInsertMappingVisitor;
22 import org.mybatis.dynamic.sql.util.NullMapping;
23 import org.mybatis.dynamic.sql.util.PropertyMapping;
24 import org.mybatis.dynamic.sql.util.RowMapping;
25 import org.mybatis.dynamic.sql.util.StringConstantMapping;
26 import org.mybatis.dynamic.sql.util.StringUtilities;
27
28 public class MultiRowValuePhraseVisitor extends MultiRowInsertMappingVisitor<FieldAndValueAndParameters> {
29 protected final RenderingStrategy renderingStrategy;
30 protected final String prefix;
31
32 protected MultiRowValuePhraseVisitor(RenderingStrategy renderingStrategy, String prefix) {
33 this.renderingStrategy = renderingStrategy;
34 this.prefix = prefix;
35 }
36
37 @Override
38 public FieldAndValueAndParameters visit(NullMapping mapping) {
39 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
40 .withValuePhrase("null")
41 .build();
42 }
43
44 @Override
45 public FieldAndValueAndParameters visit(ConstantMapping mapping) {
46 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
47 .withValuePhrase(mapping.constant())
48 .build();
49 }
50
51 @Override
52 public FieldAndValueAndParameters visit(StringConstantMapping mapping) {
53 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
54 .withValuePhrase(StringUtilities.formatConstantForSQL(mapping.constant()))
55 .build();
56 }
57
58 @Override
59 public FieldAndValueAndParameters visit(PropertyMapping mapping) {
60 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
61 .withValuePhrase(calculateJdbcPlaceholder(mapping.column(), mapping.property()))
62 .build();
63 }
64
65 @Override
66 public FieldAndValueAndParameters visit(RowMapping mapping) {
67 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
68 .withValuePhrase(calculateJdbcPlaceholder(mapping.column()))
69 .build();
70 }
71
72 private String calculateJdbcPlaceholder(SqlColumn<?> column) {
73 return column.renderingStrategy().orElse(renderingStrategy).getRecordBasedInsertBinding(column, prefix);
74 }
75
76 private String calculateJdbcPlaceholder(SqlColumn<?> column, String parameterName) {
77 return column.renderingStrategy().orElse(renderingStrategy)
78 .getRecordBasedInsertBinding(column, prefix, parameterName);
79 }
80 }