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 java.util.Set;
19 import java.util.TreeSet;
20
21 import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
22 import org.mybatis.generator.api.dom.java.JavaVisibility;
23 import org.mybatis.generator.api.dom.java.Method;
24 import org.mybatis.generator.api.dom.java.Parameter;
25 import org.mybatis.generator.api.dom.java.TopLevelClass;
26
27 public class ProviderApplyWhereMethodGenerator extends
28 AbstractJavaProviderMethodGenerator {
29
30 private static final String[] BEGINNING_METHOD_LINES = {
31 "if (example == null) {",
32 "return;",
33 "}",
34 "",
35 "String parmPhrase1;",
36 "String parmPhrase1_th;",
37 "String parmPhrase2;",
38 "String parmPhrase2_th;",
39 "String parmPhrase3;",
40 "String parmPhrase3_th;",
41 "if (includeExamplePhrase) {",
42 "parmPhrase1 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value}\";",
43 "parmPhrase1_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";",
44 "parmPhrase2 = \"%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}\";",
45 "parmPhrase2_th = \"%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";",
46 "parmPhrase3 = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d]}\";",
47 "parmPhrase3_th = \"#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";",
48 "} else {",
49 "parmPhrase1 = \"%s #{oredCriteria[%d].allCriteria[%d].value}\";",
50 "parmPhrase1_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}\";",
51 "parmPhrase2 = \"%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}\";",
52 "parmPhrase2_th = \"%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}\";",
53 "parmPhrase3 = \"#{oredCriteria[%d].allCriteria[%d].value[%d]}\";",
54 "parmPhrase3_th = \"#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}\";",
55 "}",
56 "",
57 "StringBuilder sb = new StringBuilder();",
58 "List<Criteria> oredCriteria = example.getOredCriteria();",
59 "boolean firstCriteria = true;",
60 "for (int i = 0; i < oredCriteria.size(); i++) {",
61 "Criteria criteria = oredCriteria.get(i);",
62 "if (criteria.isValid()) {",
63 "if (firstCriteria) {",
64 "firstCriteria = false;",
65 "} else {",
66 "sb.append(\" or \");",
67 "}",
68 "",
69 "sb.append('(');",
70 "List<Criterion> criterions = criteria.getAllCriteria();",
71 "boolean firstCriterion = true;",
72 "for (int j = 0; j < criterions.size(); j++) {",
73 "Criterion criterion = criterions.get(j);",
74 "if (firstCriterion) {",
75 "firstCriterion = false;",
76 "} else {",
77 "sb.append(\" and \");",
78 "}",
79 "",
80 "if (criterion.isNoValue()) {",
81 "sb.append(criterion.getCondition());",
82 "} else if (criterion.isSingleValue()) {",
83 "if (criterion.getTypeHandler() == null) {",
84 "sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));",
85 "} else {",
86 "sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,criterion.getTypeHandler()));",
87 "}",
88 "} else if (criterion.isBetweenValue()) {",
89 "if (criterion.getTypeHandler() == null) {",
90 "sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));",
91 "} else {",
92 "sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));",
93 "}",
94 "} else if (criterion.isListValue()) {",
95 "sb.append(criterion.getCondition());",
96 "sb.append(\" (\");",
97 "List<?> listItems = (List<?>) criterion.getValue();",
98 "boolean comma = false;",
99 "for (int k = 0; k < listItems.size(); k++) {",
100 "if (comma) {",
101 "sb.append(\", \");",
102 "} else {",
103 "comma = true;",
104 "}",
105 "if (criterion.getTypeHandler() == null) {",
106 "sb.append(String.format(parmPhrase3, i, j, k));",
107 "} else {",
108 "sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));",
109 "}",
110 "}",
111 "sb.append(')');",
112 "}",
113 "}",
114 "sb.append(')');",
115 "}",
116 "}",
117 ""
118 };
119
120 private static final String[] LEGACY_ENDING_METHOD_LINES = {
121 "if (sb.length() > 0) {",
122 "WHERE(sb.toString());",
123 "}"
124 };
125
126 private static final String[] ENDING_METHOD_LINES = {
127 "if (sb.length() > 0) {",
128 "sql.WHERE(sb.toString());",
129 "}"
130 };
131
132 public ProviderApplyWhereMethodGenerator(boolean useLegacyBuilder) {
133 super(useLegacyBuilder);
134 }
135
136 @Override
137 public void addClassElements(TopLevelClass topLevelClass) {
138 Set<String> staticImports = new TreeSet<String>();
139 Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
140
141 if (useLegacyBuilder) {
142 staticImports.add("org.apache.ibatis.jdbc.SqlBuilder.WHERE");
143 } else {
144 importedTypes.add(NEW_BUILDER_IMPORT);
145 }
146
147 importedTypes.add(new FullyQualifiedJavaType(
148 "java.util.List"));
149
150 FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(introspectedTable.getExampleType());
151 importedTypes.add(fqjt);
152 importedTypes.add(new FullyQualifiedJavaType(
153 String.format("%s.Criteria", fqjt.getFullyQualifiedName())));
154 importedTypes.add(new FullyQualifiedJavaType(
155 String.format("%s.Criterion", fqjt.getFullyQualifiedName())));
156
157 Method method = new Method("applyWhere");
158 method.setVisibility(JavaVisibility.PROTECTED);
159 if (!useLegacyBuilder) {
160 method.addParameter(new Parameter(NEW_BUILDER_IMPORT, "sql"));
161 }
162 method.addParameter(new Parameter(fqjt, "example"));
163 method.addParameter(new Parameter(FullyQualifiedJavaType.getBooleanPrimitiveInstance(), "includeExamplePhrase"));
164
165 context.getCommentGenerator().addGeneralMethodComment(method,
166 introspectedTable);
167
168 for (String methodLine : BEGINNING_METHOD_LINES) {
169 method.addBodyLine(methodLine);
170 }
171
172 if (useLegacyBuilder) {
173 for (String methodLine : LEGACY_ENDING_METHOD_LINES) {
174 method.addBodyLine(methodLine);
175 }
176 } else {
177 for (String methodLine : ENDING_METHOD_LINES) {
178 method.addBodyLine(methodLine);
179 }
180 }
181
182 if (context.getPlugins().providerApplyWhereMethodGenerated(method, topLevelClass,
183 introspectedTable)) {
184 topLevelClass.addStaticImports(staticImports);
185 topLevelClass.addImportedTypes(importedTypes);
186 topLevelClass.addMethod(method);
187 }
188 }
189 }