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 java.util.Objects;
19 import java.util.Optional;
20
21 import org.jspecify.annotations.Nullable;
22 import org.mybatis.dynamic.sql.insert.GeneralInsertModel;
23 import org.mybatis.dynamic.sql.render.RenderingContext;
24 import org.mybatis.dynamic.sql.render.RenderingStrategy;
25 import org.mybatis.dynamic.sql.util.Validator;
26
27 public class GeneralInsertRenderer {
28
29 private final GeneralInsertModel model;
30 private final GeneralInsertValuePhraseVisitor visitor;
31
32 private GeneralInsertRenderer(Builder builder) {
33 model = Objects.requireNonNull(builder.model);
34 RenderingContext renderingContext = RenderingContext
35 .withRenderingStrategy(Objects.requireNonNull(builder.renderingStrategy))
36 .withStatementConfiguration(model.statementConfiguration())
37 .build();
38 visitor = new GeneralInsertValuePhraseVisitor(renderingContext);
39 }
40
41 public GeneralInsertStatementProvider render() {
42 FieldAndValueCollector collector = model.columnMappings()
43 .map(m -> m.accept(visitor))
44 .flatMap(Optional::stream)
45 .collect(FieldAndValueCollector.collect());
46
47 Validator.assertFalse(collector.isEmpty(), "ERROR.9");
48
49 String insertStatement = InsertRenderingUtilities.calculateInsertStatement(model.table(), collector);
50
51 return DefaultGeneralInsertStatementProvider.withInsertStatement(insertStatement)
52 .withParameters(collector.parameters())
53 .build();
54 }
55
56 public static Builder withInsertModel(GeneralInsertModel model) {
57 return new Builder().withInsertModel(model);
58 }
59
60 public static class Builder {
61 private @Nullable GeneralInsertModel model;
62 private @Nullable RenderingStrategy renderingStrategy;
63
64 public Builder withInsertModel(GeneralInsertModel model) {
65 this.model = model;
66 return this;
67 }
68
69 public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
70 this.renderingStrategy = renderingStrategy;
71 return this;
72 }
73
74 public GeneralInsertRenderer build() {
75 return new GeneralInsertRenderer(this);
76 }
77 }
78 }