1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.codegen.mybatis3.xmlmapper.elements;
17
18 import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
19
20 import org.mybatis.generator.api.IntrospectedColumn;
21 import org.mybatis.generator.api.dom.xml.Attribute;
22 import org.mybatis.generator.api.dom.xml.TextElement;
23 import org.mybatis.generator.api.dom.xml.XmlElement;
24
25
26
27
28
29
30 public class ExampleWhereClauseElementGenerator extends
31 AbstractXmlElementGenerator {
32
33 private boolean isForUpdateByExample;
34
35 public ExampleWhereClauseElementGenerator(boolean isForUpdateByExample) {
36 super();
37 this.isForUpdateByExample = isForUpdateByExample;
38 }
39
40 @Override
41 public void addElements(XmlElement parentElement) {
42 XmlElement answer = new XmlElement("sql");
43
44 if (isForUpdateByExample) {
45 answer
46 .addAttribute(new Attribute(
47 "id", introspectedTable.getMyBatis3UpdateByExampleWhereClauseId()));
48 } else {
49 answer.addAttribute(new Attribute(
50 "id", introspectedTable.getExampleWhereClauseId()));
51 }
52
53 context.getCommentGenerator().addComment(answer);
54
55 XmlElement whereElement = new XmlElement("where");
56 answer.addElement(whereElement);
57
58 XmlElement outerForEachElement = new XmlElement("foreach");
59 if (isForUpdateByExample) {
60 outerForEachElement.addAttribute(new Attribute(
61 "collection", "example.oredCriteria"));
62 } else {
63 outerForEachElement.addAttribute(new Attribute(
64 "collection", "oredCriteria"));
65 }
66 outerForEachElement.addAttribute(new Attribute("item", "criteria"));
67 outerForEachElement.addAttribute(new Attribute("separator", "or"));
68 whereElement.addElement(outerForEachElement);
69
70 XmlElement ifElement = new XmlElement("if");
71 ifElement.addAttribute(new Attribute("test", "criteria.valid"));
72 outerForEachElement.addElement(ifElement);
73
74 XmlElement trimElement = new XmlElement("trim");
75 trimElement.addAttribute(new Attribute("prefix", "("));
76 trimElement.addAttribute(new Attribute("suffix", ")"));
77 trimElement.addAttribute(new Attribute("prefixOverrides", "and"));
78
79 ifElement.addElement(trimElement);
80
81 trimElement.addElement(getMiddleForEachElement(null));
82
83 for (IntrospectedColumn introspectedColumn : introspectedTable
84 .getNonBLOBColumns()) {
85 if (stringHasValue(introspectedColumn
86 .getTypeHandler())) {
87 trimElement
88 .addElement(getMiddleForEachElement(introspectedColumn));
89 }
90 }
91
92 if (context.getPlugins()
93 .sqlMapExampleWhereClauseElementGenerated(answer,
94 introspectedTable)) {
95 parentElement.addElement(answer);
96 }
97 }
98
99 private XmlElement getMiddleForEachElement(
100 IntrospectedColumn introspectedColumn) {
101 StringBuilder sb = new StringBuilder();
102 String criteriaAttribute;
103 boolean typeHandled;
104 String typeHandlerString;
105 if (introspectedColumn == null) {
106 criteriaAttribute = "criteria.criteria";
107 typeHandled = false;
108 typeHandlerString = null;
109 } else {
110 sb.setLength(0);
111 sb.append("criteria.");
112 sb.append(introspectedColumn.getJavaProperty());
113 sb.append("Criteria");
114 criteriaAttribute = sb.toString();
115
116 typeHandled = true;
117
118 sb.setLength(0);
119 sb.append(",typeHandler=");
120 sb.append(introspectedColumn.getTypeHandler());
121 typeHandlerString = sb.toString();
122 }
123
124 XmlElement middleForEachElement = new XmlElement("foreach");
125 middleForEachElement.addAttribute(new Attribute(
126 "collection", criteriaAttribute));
127 middleForEachElement.addAttribute(new Attribute("item", "criterion"));
128
129 XmlElement chooseElement = new XmlElement("choose");
130 middleForEachElement.addElement(chooseElement);
131
132 XmlElement when = new XmlElement("when");
133 when.addAttribute(new Attribute("test", "criterion.noValue"));
134 when.addElement(new TextElement("and ${criterion.condition}"));
135 chooseElement.addElement(when);
136
137 when = new XmlElement("when");
138 when.addAttribute(new Attribute("test", "criterion.singleValue"));
139 sb.setLength(0);
140 sb.append("and ${criterion.condition} #{criterion.value");
141 if (typeHandled) {
142 sb.append(typeHandlerString);
143 }
144 sb.append('}');
145 when.addElement(new TextElement(sb.toString()));
146 chooseElement.addElement(when);
147
148 when = new XmlElement("when");
149 when.addAttribute(new Attribute("test", "criterion.betweenValue"));
150 sb.setLength(0);
151 sb.append("and ${criterion.condition} #{criterion.value");
152 if (typeHandled) {
153 sb.append(typeHandlerString);
154 }
155 sb.append("} and #{criterion.secondValue");
156 if (typeHandled) {
157 sb.append(typeHandlerString);
158 }
159 sb.append('}');
160 when.addElement(new TextElement(sb.toString()));
161 chooseElement.addElement(when);
162
163 when = new XmlElement("when");
164 when.addAttribute(new Attribute("test", "criterion.listValue"));
165 when.addElement(new TextElement("and ${criterion.condition}"));
166 XmlElement innerForEach = new XmlElement("foreach");
167 innerForEach
168 .addAttribute(new Attribute("collection", "criterion.value"));
169 innerForEach.addAttribute(new Attribute("item", "listItem"));
170 innerForEach.addAttribute(new Attribute("open", "("));
171 innerForEach.addAttribute(new Attribute("close", ")"));
172 innerForEach.addAttribute(new Attribute("separator", ","));
173 sb.setLength(0);
174 sb.append("#{listItem");
175 if (typeHandled) {
176 sb.append(typeHandlerString);
177 }
178 sb.append('}');
179 innerForEach.addElement(new TextElement(sb.toString()));
180 when.addElement(innerForEach);
181 chooseElement.addElement(when);
182
183 return middleForEachElement;
184 }
185 }