1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.codegen.mybatis3.model;
17
18 import static org.mybatis.generator.internal.util.JavaBeansUtil.getGetterMethodName;
19 import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
20 import static org.mybatis.generator.internal.util.messages.Messages.getString;
21
22 import java.util.ArrayList;
23 import java.util.Iterator;
24 import java.util.List;
25
26 import org.mybatis.generator.api.CommentGenerator;
27 import org.mybatis.generator.api.FullyQualifiedTable;
28 import org.mybatis.generator.api.IntrospectedColumn;
29 import org.mybatis.generator.api.dom.OutputUtilities;
30 import org.mybatis.generator.api.dom.java.CompilationUnit;
31 import org.mybatis.generator.api.dom.java.Field;
32 import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
33 import org.mybatis.generator.api.dom.java.InnerClass;
34 import org.mybatis.generator.api.dom.java.JavaVisibility;
35 import org.mybatis.generator.api.dom.java.Method;
36 import org.mybatis.generator.api.dom.java.Parameter;
37 import org.mybatis.generator.api.dom.java.TopLevelClass;
38 import org.mybatis.generator.codegen.AbstractJavaGenerator;
39 import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
40
41 public class ExampleGenerator extends AbstractJavaGenerator {
42
43 public ExampleGenerator(String project) {
44 super(project);
45 }
46
47 @Override
48 public List<CompilationUnit> getCompilationUnits() {
49 FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
50 progressCallback.startTask(getString("Progress.6", table.toString()));
51 CommentGenerator commentGenerator = context.getCommentGenerator();
52
53 FullyQualifiedJavaType type = new FullyQualifiedJavaType(introspectedTable.getExampleType());
54 TopLevelClass topLevelClass = new TopLevelClass(type);
55 topLevelClass.setVisibility(JavaVisibility.PUBLIC);
56 commentGenerator.addJavaFileComment(topLevelClass);
57
58
59 Method method = new Method(type.getShortName());
60 method.setVisibility(JavaVisibility.PUBLIC);
61 method.setConstructor(true);
62 method.addBodyLine("oredCriteria = new ArrayList<>();");
63
64 commentGenerator.addGeneralMethodComment(method, introspectedTable);
65 topLevelClass.addMethod(method);
66
67
68 Field field = new Field("orderByClause", FullyQualifiedJavaType.getStringInstance());
69 field.setVisibility(JavaVisibility.PROTECTED);
70 commentGenerator.addFieldComment(field, introspectedTable);
71 topLevelClass.addField(field);
72
73 method = new Method("setOrderByClause");
74 method.setVisibility(JavaVisibility.PUBLIC);
75 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "orderByClause"));
76 method.addBodyLine("this.orderByClause = orderByClause;");
77 commentGenerator.addGeneralMethodComment(method, introspectedTable);
78 topLevelClass.addMethod(method);
79
80 method = new Method("getOrderByClause");
81 method.setVisibility(JavaVisibility.PUBLIC);
82 method.setReturnType(FullyQualifiedJavaType.getStringInstance());
83 method.addBodyLine("return orderByClause;");
84 commentGenerator.addGeneralMethodComment(method, introspectedTable);
85 topLevelClass.addMethod(method);
86
87
88 field = new Field("distinct", FullyQualifiedJavaType.getBooleanPrimitiveInstance());
89 field.setVisibility(JavaVisibility.PROTECTED);
90 commentGenerator.addFieldComment(field, introspectedTable);
91 topLevelClass.addField(field);
92
93 method = new Method("setDistinct");
94 method.setVisibility(JavaVisibility.PUBLIC);
95 method.addParameter(
96 new Parameter(FullyQualifiedJavaType.getBooleanPrimitiveInstance(), "distinct"));
97 method.addBodyLine("this.distinct = distinct;");
98 commentGenerator.addGeneralMethodComment(method, introspectedTable);
99 topLevelClass.addMethod(method);
100
101 method = new Method("isDistinct");
102 method.setVisibility(JavaVisibility.PUBLIC);
103 method.setReturnType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
104 method.addBodyLine("return distinct;");
105 commentGenerator.addGeneralMethodComment(method, introspectedTable);
106 topLevelClass.addMethod(method);
107
108
109 FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.util.List<Criteria>");
110 field = new Field("oredCriteria", fqjt);
111 field.setVisibility(JavaVisibility.PROTECTED);
112
113 commentGenerator.addFieldComment(field, introspectedTable);
114 topLevelClass.addField(field);
115
116 method = new Method("getOredCriteria");
117 method.setVisibility(JavaVisibility.PUBLIC);
118 method.setReturnType(fqjt);
119 method.addBodyLine("return oredCriteria;");
120 commentGenerator.addGeneralMethodComment(method, introspectedTable);
121 topLevelClass.addMethod(method);
122
123 method = new Method("or");
124 method.setVisibility(JavaVisibility.PUBLIC);
125 method.addParameter(new Parameter(FullyQualifiedJavaType.getCriteriaInstance(), "criteria"));
126 method.addBodyLine("oredCriteria.add(criteria);");
127 commentGenerator.addGeneralMethodComment(method, introspectedTable);
128 topLevelClass.addMethod(method);
129
130 method = new Method("or");
131 method.setVisibility(JavaVisibility.PUBLIC);
132 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
133 method.addBodyLine("Criteria criteria = createCriteriaInternal();");
134 method.addBodyLine("oredCriteria.add(criteria);");
135 method.addBodyLine("return criteria;");
136 commentGenerator.addGeneralMethodComment(method, introspectedTable);
137 topLevelClass.addMethod(method);
138
139 method = new Method("createCriteria");
140 method.setVisibility(JavaVisibility.PUBLIC);
141 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
142 method.addBodyLine("Criteria criteria = createCriteriaInternal();");
143 method.addBodyLine("if (oredCriteria.size() == 0) {");
144 method.addBodyLine("oredCriteria.add(criteria);");
145 method.addBodyLine("}");
146 method.addBodyLine("return criteria;");
147 commentGenerator.addGeneralMethodComment(method, introspectedTable);
148 topLevelClass.addMethod(method);
149
150 method = new Method("createCriteriaInternal");
151 method.setVisibility(JavaVisibility.PROTECTED);
152 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
153 method.addBodyLine("Criteria criteria = new Criteria();");
154 method.addBodyLine("return criteria;");
155 commentGenerator.addGeneralMethodComment(method, introspectedTable);
156 topLevelClass.addMethod(method);
157
158 method = new Method("clear");
159 method.setVisibility(JavaVisibility.PUBLIC);
160 method.addBodyLine("oredCriteria.clear();");
161 method.addBodyLine("orderByClause = null;");
162 method.addBodyLine("distinct = false;");
163 commentGenerator.addGeneralMethodComment(method, introspectedTable);
164 topLevelClass.addMethod(method);
165
166
167 topLevelClass.addInnerClass(getGeneratedCriteriaInnerClass(topLevelClass));
168
169 topLevelClass.addInnerClass(getCriteriaInnerClass());
170
171 topLevelClass.addInnerClass(getCriterionInnerClass());
172
173 List<CompilationUnit> answer = new ArrayList<>();
174 if (context.getPlugins().modelExampleClassGenerated(topLevelClass, introspectedTable)) {
175 answer.add(topLevelClass);
176 }
177 return answer;
178 }
179
180 private InnerClass getCriterionInnerClass() {
181 InnerClass answer = new InnerClass(new FullyQualifiedJavaType("Criterion"));
182 answer.setVisibility(JavaVisibility.PUBLIC);
183 answer.setStatic(true);
184 context.getCommentGenerator().addClassComment(answer, introspectedTable);
185
186 Field field = new Field("condition", FullyQualifiedJavaType.getStringInstance());
187 field.setVisibility(JavaVisibility.PRIVATE);
188 answer.addField(field);
189 answer.addMethod(getGetter(field));
190
191 field = new Field("value", FullyQualifiedJavaType.getObjectInstance());
192 field.setVisibility(JavaVisibility.PRIVATE);
193 answer.addField(field);
194 answer.addMethod(getGetter(field));
195
196 field = new Field("secondValue", FullyQualifiedJavaType.getObjectInstance());
197 field.setVisibility(JavaVisibility.PRIVATE);
198 answer.addField(field);
199 answer.addMethod(getGetter(field));
200
201 field = new Field("noValue", FullyQualifiedJavaType.getBooleanPrimitiveInstance());
202 field.setVisibility(JavaVisibility.PRIVATE);
203 answer.addField(field);
204 answer.addMethod(getGetter(field));
205
206 field = new Field("singleValue", FullyQualifiedJavaType.getBooleanPrimitiveInstance());
207 field.setVisibility(JavaVisibility.PRIVATE);
208 answer.addField(field);
209 answer.addMethod(getGetter(field));
210
211 field = new Field("betweenValue", FullyQualifiedJavaType.getBooleanPrimitiveInstance());
212 field.setVisibility(JavaVisibility.PRIVATE);
213 answer.addField(field);
214 answer.addMethod(getGetter(field));
215
216 field = new Field("listValue", FullyQualifiedJavaType.getBooleanPrimitiveInstance());
217 field.setVisibility(JavaVisibility.PRIVATE);
218 answer.addField(field);
219 answer.addMethod(getGetter(field));
220
221 field = new Field("typeHandler", FullyQualifiedJavaType.getStringInstance());
222 field.setVisibility(JavaVisibility.PRIVATE);
223 answer.addField(field);
224 answer.addMethod(getGetter(field));
225
226 Method method = new Method("Criterion");
227 method.setVisibility(JavaVisibility.PROTECTED);
228 method.setConstructor(true);
229 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
230 method.addBodyLine("super();");
231 method.addBodyLine("this.condition = condition;");
232 method.addBodyLine("this.typeHandler = null;");
233 method.addBodyLine("this.noValue = true;");
234 answer.addMethod(method);
235
236 method = new Method("Criterion");
237 method.setVisibility(JavaVisibility.PROTECTED);
238 method.setConstructor(true);
239 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
240 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value"));
241 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "typeHandler"));
242 method.addBodyLine("super();");
243 method.addBodyLine("this.condition = condition;");
244 method.addBodyLine("this.value = value;");
245 method.addBodyLine("this.typeHandler = typeHandler;");
246 method.addBodyLine("if (value instanceof List<?>) {");
247 method.addBodyLine("this.listValue = true;");
248 method.addBodyLine("} else {");
249 method.addBodyLine("this.singleValue = true;");
250 method.addBodyLine("}");
251 answer.addMethod(method);
252
253 method = createCriterionConstructor();
254 method.addBodyLine("this(condition, value, null);");
255 answer.addMethod(method);
256
257 method = createCriterionConstructor();
258 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "secondValue"));
259 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "typeHandler"));
260 method.addBodyLine("super();");
261 method.addBodyLine("this.condition = condition;");
262 method.addBodyLine("this.value = value;");
263 method.addBodyLine("this.secondValue = secondValue;");
264 method.addBodyLine("this.typeHandler = typeHandler;");
265 method.addBodyLine("this.betweenValue = true;");
266 answer.addMethod(method);
267
268 method = createCriterionConstructor();
269 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "secondValue"));
270 method.addBodyLine("this(condition, value, secondValue, null);");
271 answer.addMethod(method);
272
273 return answer;
274 }
275
276 private Method createCriterionConstructor() {
277 Method method = new Method("Criterion");
278 method.setVisibility(JavaVisibility.PROTECTED);
279 method.setConstructor(true);
280 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
281 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value"));
282 return method;
283 }
284
285 private InnerClass getCriteriaInnerClass() {
286 InnerClass answer = new InnerClass(FullyQualifiedJavaType.getCriteriaInstance());
287
288 answer.setVisibility(JavaVisibility.PUBLIC);
289 answer.setStatic(true);
290 answer.setSuperClass(FullyQualifiedJavaType.getGeneratedCriteriaInstance());
291
292 context.getCommentGenerator().addClassComment(answer, introspectedTable, true);
293
294 Method method = new Method("Criteria");
295 method.setVisibility(JavaVisibility.PROTECTED);
296 method.setConstructor(true);
297 method.addBodyLine("super();");
298 answer.addMethod(method);
299
300 return answer;
301 }
302
303 private InnerClass getGeneratedCriteriaInnerClass(TopLevelClass topLevelClass) {
304 Field field;
305
306 InnerClass answer = new InnerClass(FullyQualifiedJavaType.getGeneratedCriteriaInstance());
307
308 answer.setVisibility(JavaVisibility.PROTECTED);
309 answer.setStatic(true);
310 answer.setAbstract(true);
311 context.getCommentGenerator().addClassComment(answer, introspectedTable);
312
313 Method method = new Method("GeneratedCriteria");
314 method.setVisibility(JavaVisibility.PROTECTED);
315 method.setConstructor(true);
316 method.addBodyLine("super();");
317 method.addBodyLine("criteria = new ArrayList<>();");
318 answer.addMethod(method);
319
320 List<String> criteriaLists = new ArrayList<>();
321 criteriaLists.add("criteria");
322
323 for (IntrospectedColumn introspectedColumn : introspectedTable.getNonBLOBColumns()) {
324 if (stringHasValue(introspectedColumn.getTypeHandler())) {
325 String name = addTypeHandledObjectsAndMethods(introspectedColumn, method, answer);
326 criteriaLists.add(name);
327 }
328 }
329
330
331 method = new Method("isValid");
332 method.setVisibility(JavaVisibility.PUBLIC);
333 method.setReturnType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
334 StringBuilder sb = new StringBuilder();
335 Iterator<String> strIter = criteriaLists.iterator();
336 sb.append("return ");
337 sb.append(strIter.next());
338 sb.append(".size() > 0");
339 if (!strIter.hasNext()) {
340 sb.append(';');
341 }
342 method.addBodyLine(sb.toString());
343 while (strIter.hasNext()) {
344 sb.setLength(0);
345 OutputUtilities.javaIndent(sb, 1);
346 sb.append("|| ");
347 sb.append(strIter.next());
348 sb.append(".size() > 0");
349 if (!strIter.hasNext()) {
350 sb.append(';');
351 }
352 method.addBodyLine(sb.toString());
353 }
354 answer.addMethod(method);
355
356
357 if (criteriaLists.size() > 1) {
358 field = new Field("allCriteria",
359 new FullyQualifiedJavaType("List<Criterion>"));
360 field.setVisibility(JavaVisibility.PROTECTED);
361 answer.addField(field);
362 }
363
364 method = new Method("getAllCriteria");
365 method.setVisibility(JavaVisibility.PUBLIC);
366 method.setReturnType(new FullyQualifiedJavaType("List<Criterion>"));
367 if (criteriaLists.size() < 2) {
368 method.addBodyLine("return criteria;");
369 } else {
370 method.addBodyLine("if (allCriteria == null) {");
371 method.addBodyLine("allCriteria = new ArrayList<>();");
372
373 strIter = criteriaLists.iterator();
374 while (strIter.hasNext()) {
375 method.addBodyLine(String.format("allCriteria.addAll(%s);", strIter.next()));
376 }
377
378 method.addBodyLine("}");
379 method.addBodyLine("return allCriteria;");
380 }
381 answer.addMethod(method);
382
383
384
385 topLevelClass.addImportedType(FullyQualifiedJavaType.getNewListInstance());
386 topLevelClass.addImportedType(FullyQualifiedJavaType.getNewArrayListInstance());
387
388 FullyQualifiedJavaType listOfCriterion =
389 new FullyQualifiedJavaType("java.util.List<Criterion>");
390 field = new Field("criteria", listOfCriterion);
391 field.setVisibility(JavaVisibility.PROTECTED);
392 answer.addField(field);
393
394 method = new Method(getGetterMethodName(field.getName(), field.getType()));
395 method.setVisibility(JavaVisibility.PUBLIC);
396 method.setReturnType(field.getType());
397 method.addBodyLine("return criteria;");
398 answer.addMethod(method);
399
400
401 method = new Method("addCriterion");
402 method.setVisibility(JavaVisibility.PROTECTED);
403 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
404 method.addBodyLine("if (condition == null) {");
405 method.addBodyLine("throw new RuntimeException(\"Value for condition cannot be null\");");
406 method.addBodyLine("}");
407 method.addBodyLine("criteria.add(new Criterion(condition));");
408 if (criteriaLists.size() > 1) {
409 method.addBodyLine("allCriteria = null;");
410 }
411 answer.addMethod(method);
412
413 method = new Method("addCriterion");
414 method.setVisibility(JavaVisibility.PROTECTED);
415 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
416 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value"));
417 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
418 method.addBodyLine("if (value == null) {");
419 method.addBodyLine(
420 "throw new RuntimeException(\"Value for \" + property + \" cannot be null\");");
421 method.addBodyLine("}");
422 method.addBodyLine("criteria.add(new Criterion(condition, value));");
423 if (criteriaLists.size() > 1) {
424 method.addBodyLine("allCriteria = null;");
425 }
426 answer.addMethod(method);
427
428 method = new Method("addCriterion");
429 method.setVisibility(JavaVisibility.PROTECTED);
430 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
431 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value1"));
432 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value2"));
433 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
434 method.addBodyLine("if (value1 == null || value2 == null) {");
435 method.addBodyLine(
436 "throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");");
437 method.addBodyLine("}");
438 method.addBodyLine("criteria.add(new Criterion(condition, value1, value2));");
439 if (criteriaLists.size() > 1) {
440 method.addBodyLine("allCriteria = null;");
441 }
442 answer.addMethod(method);
443
444 FullyQualifiedJavaType listOfDates =
445 new FullyQualifiedJavaType("java.util.List<java.util.Date>");
446
447 if (introspectedTable.hasJDBCDateColumns()) {
448 topLevelClass.addImportedType(FullyQualifiedJavaType.getDateInstance());
449 topLevelClass.addImportedType(FullyQualifiedJavaType.getNewIteratorInstance());
450 method = new Method("addCriterionForJDBCDate");
451 method.setVisibility(JavaVisibility.PROTECTED);
452 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
453 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value"));
454 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
455 method.addBodyLine("if (value == null) {");
456 method.addBodyLine(
457 "throw new RuntimeException(\"Value for \" + property + \" cannot be null\");");
458 method.addBodyLine("}");
459 method.addBodyLine(
460 "addCriterion(condition, new java.sql.Date(value.getTime()), property);");
461 answer.addMethod(method);
462
463 method = new Method("addCriterionForJDBCDate");
464 method.setVisibility(JavaVisibility.PROTECTED);
465 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
466 method.addParameter(new Parameter(listOfDates, "values"));
467 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
468 method.addBodyLine("if (values == null || values.size() == 0) {");
469 method.addBodyLine(
470 "throw new RuntimeException(\"Value list for \" + property + \""
471 + " cannot be null or empty\");");
472 method.addBodyLine("}");
473 method.addBodyLine("List<java.sql.Date> dateList = new ArrayList<>();");
474 method.addBodyLine("Iterator<Date> iter = values.iterator();");
475 method.addBodyLine("while (iter.hasNext()) {");
476 method.addBodyLine("dateList.add(new java.sql.Date(iter.next().getTime()));");
477 method.addBodyLine("}");
478 method.addBodyLine("addCriterion(condition, dateList, property);");
479 answer.addMethod(method);
480
481 method = new Method("addCriterionForJDBCDate");
482 method.setVisibility(JavaVisibility.PROTECTED);
483 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
484 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value1"));
485 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value2"));
486 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
487 method.addBodyLine("if (value1 == null || value2 == null) {");
488 method.addBodyLine(
489 "throw new RuntimeException(\"Between values for \" + property + \""
490 + " cannot be null\");");
491 method.addBodyLine("}");
492 method.addBodyLine(
493 "addCriterion(condition, new java.sql.Date(value1.getTime()),"
494 + " new java.sql.Date(value2.getTime()), property);");
495 answer.addMethod(method);
496 }
497
498 if (introspectedTable.hasJDBCTimeColumns()) {
499 topLevelClass.addImportedType(FullyQualifiedJavaType.getDateInstance());
500 topLevelClass.addImportedType(FullyQualifiedJavaType.getNewIteratorInstance());
501 method = new Method("addCriterionForJDBCTime");
502 method.setVisibility(JavaVisibility.PROTECTED);
503 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
504 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value"));
505 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
506 method.addBodyLine("if (value == null) {");
507 method.addBodyLine(
508 "throw new RuntimeException(\"Value for \" + property + \" cannot be null\");");
509 method.addBodyLine("}");
510 method.addBodyLine(
511 "addCriterion(condition, new java.sql.Time(value.getTime()), property);");
512 answer.addMethod(method);
513
514 method = new Method("addCriterionForJDBCTime");
515 method.setVisibility(JavaVisibility.PROTECTED);
516 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
517 method.addParameter(new Parameter(listOfDates, "values"));
518 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
519 method.addBodyLine("if (values == null || values.size() == 0) {");
520 method.addBodyLine(
521 "throw new RuntimeException(\"Value list for \" + property + \""
522 + " cannot be null or empty\");");
523 method.addBodyLine("}");
524 method.addBodyLine("List<java.sql.Time> timeList = new ArrayList<>();");
525 method.addBodyLine("Iterator<Date> iter = values.iterator();");
526 method.addBodyLine("while (iter.hasNext()) {");
527 method.addBodyLine("timeList.add(new java.sql.Time(iter.next().getTime()));");
528 method.addBodyLine("}");
529 method.addBodyLine("addCriterion(condition, timeList, property);");
530 answer.addMethod(method);
531
532 method = new Method("addCriterionForJDBCTime");
533 method.setVisibility(JavaVisibility.PROTECTED);
534 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
535 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value1"));
536 method.addParameter(new Parameter(FullyQualifiedJavaType.getDateInstance(), "value2"));
537 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
538 method.addBodyLine("if (value1 == null || value2 == null) {");
539 method.addBodyLine(
540 "throw new RuntimeException(\"Between values for \" + property + \""
541 + " cannot be null\");");
542 method.addBodyLine("}");
543 method.addBodyLine(
544 "addCriterion(condition, new java.sql.Time(value1.getTime()),"
545 + " new java.sql.Time(value2.getTime()), property);");
546 answer.addMethod(method);
547 }
548
549 for (IntrospectedColumn introspectedColumn : introspectedTable.getNonBLOBColumns()) {
550 topLevelClass.addImportedType(introspectedColumn.getFullyQualifiedJavaType());
551
552
553
554 answer.addMethod(getSetNullMethod(introspectedColumn));
555 answer.addMethod(getSetNotNullMethod(introspectedColumn));
556 answer.addMethod(getSetEqualMethod(introspectedColumn));
557 answer.addMethod(getSetNotEqualMethod(introspectedColumn));
558 answer.addMethod(getSetGreaterThanMethod(introspectedColumn));
559 answer.addMethod(getSetGreaterThenOrEqualMethod(introspectedColumn));
560 answer.addMethod(getSetLessThanMethod(introspectedColumn));
561 answer.addMethod(getSetLessThanOrEqualMethod(introspectedColumn));
562
563 if (introspectedColumn.isJdbcCharacterColumn()) {
564 answer.addMethod(getSetLikeMethod(introspectedColumn));
565 answer.addMethod(getSetNotLikeMethod(introspectedColumn));
566 }
567
568 answer.addMethod(getSetInOrNotInMethod(introspectedColumn, true));
569 answer.addMethod(getSetInOrNotInMethod(introspectedColumn, false));
570 answer.addMethod(getSetBetweenOrNotBetweenMethod(introspectedColumn, true));
571 answer.addMethod(getSetBetweenOrNotBetweenMethod(introspectedColumn, false));
572 }
573
574 return answer;
575 }
576
577 private Method getSetNullMethod(IntrospectedColumn introspectedColumn) {
578 return getNoValueMethod(introspectedColumn, "IsNull", "is null");
579 }
580
581 private Method getSetNotNullMethod(IntrospectedColumn introspectedColumn) {
582 return getNoValueMethod(introspectedColumn, "IsNotNull", "is not null");
583 }
584
585 private Method getSetEqualMethod(IntrospectedColumn introspectedColumn) {
586 return getSingleValueMethod(introspectedColumn, "EqualTo", "=");
587 }
588
589 private Method getSetNotEqualMethod(IntrospectedColumn introspectedColumn) {
590 return getSingleValueMethod(introspectedColumn, "NotEqualTo", "<>");
591 }
592
593 private Method getSetGreaterThanMethod(IntrospectedColumn introspectedColumn) {
594 return getSingleValueMethod(introspectedColumn, "GreaterThan", ">");
595 }
596
597 private Method getSetGreaterThenOrEqualMethod(IntrospectedColumn introspectedColumn) {
598 return getSingleValueMethod(introspectedColumn,"GreaterThanOrEqualTo", ">=");
599 }
600
601 private Method getSetLessThanMethod(IntrospectedColumn introspectedColumn) {
602 return getSingleValueMethod(introspectedColumn, "LessThan", "<");
603 }
604
605 private Method getSetLessThanOrEqualMethod(IntrospectedColumn introspectedColumn) {
606 return getSingleValueMethod(introspectedColumn,"LessThanOrEqualTo", "<=");
607 }
608
609 private Method getSetLikeMethod(IntrospectedColumn introspectedColumn) {
610 return getSingleValueMethod(introspectedColumn, "Like", "like");
611 }
612
613 private Method getSetNotLikeMethod(IntrospectedColumn introspectedColumn) {
614 return getSingleValueMethod(introspectedColumn, "NotLike", "not like");
615 }
616
617 private Method getSingleValueMethod(IntrospectedColumn introspectedColumn, String nameFragment, String operator) {
618
619 StringBuilder sb = new StringBuilder();
620 sb.append(initializeAndMethodName(introspectedColumn));
621 sb.append(nameFragment);
622
623 Method method = new Method(sb.toString());
624 method.setVisibility(JavaVisibility.PUBLIC);
625 method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), "value"));
626 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
627
628 sb.setLength(0);
629 sb.append(initializeAddLine(introspectedColumn));
630 sb.append(' ');
631 sb.append(operator);
632 sb.append("\", ");
633 sb.append("value");
634 sb.append(", \"");
635 sb.append(introspectedColumn.getJavaProperty());
636 sb.append("\");");
637 method.addBodyLine(sb.toString());
638 method.addBodyLine("return (Criteria) this;");
639
640 return method;
641 }
642
643 private String initializeAndMethodName(IntrospectedColumn introspectedColumn) {
644 StringBuilder sb = new StringBuilder();
645 sb.append(introspectedColumn.getJavaProperty());
646 sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
647 sb.insert(0, "and");
648 return sb.toString();
649 }
650
651 private String initializeAddLine(IntrospectedColumn introspectedColumn) {
652 StringBuilder sb = new StringBuilder();
653 if (introspectedColumn.isJDBCDateColumn()) {
654 sb.append("addCriterionForJDBCDate(\"");
655 } else if (introspectedColumn.isJDBCTimeColumn()) {
656 sb.append("addCriterionForJDBCTime(\"");
657 } else if (stringHasValue(introspectedColumn.getTypeHandler())) {
658 sb.append("add");
659 sb.append(introspectedColumn.getJavaProperty());
660 sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
661 sb.append("Criterion(\"");
662 } else {
663 sb.append("addCriterion(\"");
664 }
665
666 sb.append(MyBatis3FormattingUtilities.getAliasedActualColumnName(introspectedColumn));
667 return sb.toString();
668 }
669
670
671
672
673
674
675
676
677 private Method getSetBetweenOrNotBetweenMethod(IntrospectedColumn introspectedColumn, boolean betweenMethod) {
678
679 StringBuilder sb = new StringBuilder();
680 sb.append(initializeAndMethodName(introspectedColumn));
681 if (betweenMethod) {
682 sb.append("Between");
683 } else {
684 sb.append("NotBetween");
685 }
686 Method method = new Method(sb.toString());
687 method.setVisibility(JavaVisibility.PUBLIC);
688 FullyQualifiedJavaType type = introspectedColumn.getFullyQualifiedJavaType();
689
690 method.addParameter(new Parameter(type, "value1"));
691 method.addParameter(new Parameter(type, "value2"));
692 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
693
694 sb.setLength(0);
695 sb.append(initializeAddLine(introspectedColumn));
696 if (betweenMethod) {
697 sb.append(" between");
698 } else {
699 sb.append(" not between");
700 }
701 sb.append("\", ");
702 sb.append("value1, value2");
703 sb.append(", \"");
704 sb.append(introspectedColumn.getJavaProperty());
705 sb.append("\");");
706 method.addBodyLine(sb.toString());
707 method.addBodyLine("return (Criteria) this;");
708
709 return method;
710 }
711
712
713
714
715
716
717
718
719
720
721 private Method getSetInOrNotInMethod(IntrospectedColumn introspectedColumn, boolean inMethod) {
722 StringBuilder sb = new StringBuilder();
723 sb.append(initializeAndMethodName(introspectedColumn));
724 if (inMethod) {
725 sb.append("In");
726 } else {
727 sb.append("NotIn");
728 }
729 Method method = new Method(sb.toString());
730 method.setVisibility(JavaVisibility.PUBLIC);
731 FullyQualifiedJavaType type = FullyQualifiedJavaType.getNewListInstance();
732 if (introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
733 type.addTypeArgument(introspectedColumn.getFullyQualifiedJavaType().getPrimitiveTypeWrapper());
734 } else {
735 type.addTypeArgument(introspectedColumn.getFullyQualifiedJavaType());
736 }
737
738 method.addParameter(new Parameter(type, "values"));
739 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
740
741 sb.setLength(0);
742 sb.append(initializeAddLine(introspectedColumn));
743 if (inMethod) {
744 sb.append(" in");
745 } else {
746 sb.append(" not in");
747 }
748 sb.append("\", values, \"");
749 sb.append(introspectedColumn.getJavaProperty());
750 sb.append("\");");
751 method.addBodyLine(sb.toString());
752 method.addBodyLine("return (Criteria) this;");
753
754 return method;
755 }
756
757 private Method getNoValueMethod(IntrospectedColumn introspectedColumn, String nameFragment, String operator) {
758 StringBuilder sb = new StringBuilder();
759 sb.append(initializeAndMethodName(introspectedColumn));
760 sb.append(nameFragment);
761 Method method = new Method(sb.toString());
762
763 method.setVisibility(JavaVisibility.PUBLIC);
764 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
765
766 sb.setLength(0);
767 sb.append("addCriterion(\"");
768 sb.append(MyBatis3FormattingUtilities.getAliasedActualColumnName(introspectedColumn));
769 sb.append(' ');
770 sb.append(operator);
771 sb.append("\");");
772 method.addBodyLine(sb.toString());
773 method.addBodyLine("return (Criteria) this;");
774
775 return method;
776 }
777
778
779
780
781
782
783
784
785
786
787 private String addTypeHandledObjectsAndMethods(IntrospectedColumn introspectedColumn, Method constructor,
788 InnerClass innerClass) {
789 StringBuilder sb = new StringBuilder();
790
791
792 sb.setLength(0);
793 sb.append(introspectedColumn.getJavaProperty());
794 sb.append("Criteria");
795 String answer = sb.toString();
796
797 Field field = new Field(answer, new FullyQualifiedJavaType("java.util.List<Criterion>"));
798 field.setVisibility(JavaVisibility.PROTECTED);
799 innerClass.addField(field);
800
801 Method method = new Method(getGetterMethodName(field.getName(), field.getType()));
802 method.setVisibility(JavaVisibility.PUBLIC);
803 method.setReturnType(field.getType());
804 sb.insert(0, "return ");
805 sb.append(';');
806 method.addBodyLine(sb.toString());
807 innerClass.addMethod(method);
808
809
810 sb.setLength(0);
811 sb.append(field.getName());
812 sb.append(" = new ArrayList<>();");
813 constructor.addBodyLine(sb.toString());
814
815
816 sb.setLength(0);
817 sb.append("add");
818 sb.append(introspectedColumn.getJavaProperty());
819 sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
820 sb.append("Criterion");
821 method = new Method(sb.toString());
822 method.setVisibility(JavaVisibility.PROTECTED);
823 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
824 method.addParameter(new Parameter(FullyQualifiedJavaType.getObjectInstance(), "value"));
825 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
826 method.addBodyLine("if (value == null) {");
827 method.addBodyLine(
828 "throw new RuntimeException(\"Value for \" + property + \" cannot be null\");");
829 method.addBodyLine("}");
830
831 method.addBodyLine(
832 String.format("%s.add(new Criterion(condition, value, \"%s\"));",
833 field.getName(), introspectedColumn.getTypeHandler()));
834 method.addBodyLine("allCriteria = null;");
835 innerClass.addMethod(method);
836
837 sb.setLength(0);
838 sb.append("add");
839 sb.append(introspectedColumn.getJavaProperty());
840 sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
841 sb.append("Criterion");
842
843 method = new Method(sb.toString());
844 method.setVisibility(JavaVisibility.PROTECTED);
845 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "condition"));
846 method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), "value1"));
847 method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), "value2"));
848 method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "property"));
849 if (!introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
850 method.addBodyLine("if (value1 == null || value2 == null) {");
851 method.addBodyLine(
852 "throw new RuntimeException(\"Between values for \" + property + \""
853 + " cannot be null\");");
854 method.addBodyLine("}");
855 }
856
857 method.addBodyLine(
858 String.format("%s.add(new Criterion(condition, value1, value2, \"%s\"));",
859 field.getName(), introspectedColumn.getTypeHandler()));
860
861 method.addBodyLine("allCriteria = null;");
862 innerClass.addMethod(method);
863
864 return answer;
865 }
866 }