1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.codegen.mybatis3.javamapper.elements.sqlprovider;
17
18 import static org.mybatis.generator.internal.util.JavaBeansUtil.getGetterMethodName;
19 import static org.mybatis.generator.internal.util.StringUtility.escapeStringForJava;
20 import static org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities.getAliasedEscapedColumnName;
21 import static org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities.getParameterClause;
22
23 import java.util.Set;
24 import java.util.TreeSet;
25
26 import org.mybatis.generator.api.IntrospectedColumn;
27 import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
28 import org.mybatis.generator.api.dom.java.JavaVisibility;
29 import org.mybatis.generator.api.dom.java.Method;
30 import org.mybatis.generator.api.dom.java.Parameter;
31 import org.mybatis.generator.api.dom.java.TopLevelClass;
32
33
34
35
36
37
38 public class ProviderUpdateByExampleSelectiveMethodGenerator extends
39 AbstractJavaProviderMethodGenerator {
40
41 public ProviderUpdateByExampleSelectiveMethodGenerator(boolean useLegacyBuilder) {
42 super(useLegacyBuilder);
43 }
44
45 @Override
46 public void addClassElements(TopLevelClass topLevelClass) {
47 Set<String> staticImports = new TreeSet<String>();
48 Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
49
50 if (useLegacyBuilder) {
51 staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.BEGIN");
52 staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.UPDATE");
53 staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.SET");
54 staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.SQL");
55 } else {
56 importedTypes.add(NEW_BUILDER_IMPORT);
57 }
58
59 importedTypes.add(new FullyQualifiedJavaType("java.util.Map"));
60
61 Method method = new Method(introspectedTable.getUpdateByExampleSelectiveStatementId());
62 method.setReturnType(FullyQualifiedJavaType.getStringInstance());
63 method.setVisibility(JavaVisibility.PUBLIC);
64 method.addParameter(new Parameter(new FullyQualifiedJavaType("java.util.Map<java.lang.String, java.lang.Object>"),
65 "parameter"));
66
67 FullyQualifiedJavaType record =
68 introspectedTable.getRules().calculateAllFieldsClass();
69 importedTypes.add(record);
70 method.addBodyLine(String.format("%s record = (%s) parameter.get(\"record\");",
71 record.getShortName(), record.getShortName()));
72
73 FullyQualifiedJavaType example =
74 new FullyQualifiedJavaType(introspectedTable.getExampleType());
75 importedTypes.add(example);
76 method.addBodyLine(String.format("%s example = (%s) parameter.get(\"example\");",
77 example.getShortName(), example.getShortName()));
78
79 context.getCommentGenerator().addGeneralMethodComment(method,
80 introspectedTable);
81
82 method.addBodyLine("");
83
84 if (useLegacyBuilder) {
85 method.addBodyLine("BEGIN();");
86 } else {
87 method.addBodyLine("SQL sql = new SQL();");
88 }
89
90 method.addBodyLine(String.format("%sUPDATE(\"%s\");",
91 builderPrefix,
92 escapeStringForJava(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime())));
93 method.addBodyLine("");
94
95 for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
96 if (!introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
97 method.addBodyLine(String.format("if (record.%s() != null) {",
98 getGetterMethodName(introspectedColumn.getJavaProperty(),
99 introspectedColumn.getFullyQualifiedJavaType())));
100 }
101
102 StringBuilder sb = new StringBuilder();
103 sb.append(getParameterClause(introspectedColumn));
104 sb.insert(2, "record.");
105
106 method.addBodyLine(String.format("%sSET(\"%s = %s\");",
107 builderPrefix,
108 escapeStringForJava(getAliasedEscapedColumnName(introspectedColumn)),
109 sb.toString()));
110
111 if (!introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
112 method.addBodyLine("}");
113 }
114
115 method.addBodyLine("");
116 }
117
118 if (useLegacyBuilder) {
119 method.addBodyLine("applyWhere(example, true);");
120 method.addBodyLine("return SQL();");
121 } else {
122 method.addBodyLine("applyWhere(sql, example, true);");
123 method.addBodyLine("return sql.toString();");
124 }
125
126 if (context.getPlugins().providerUpdateByExampleSelectiveMethodGenerated(method, topLevelClass,
127 introspectedTable)) {
128 topLevelClass.addStaticImports(staticImports);
129 topLevelClass.addImportedTypes(importedTypes);
130 topLevelClass.addMethod(method);
131 }
132 }
133 }