1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.runtime.dynamic.sql;
17
18 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansFieldWithGeneratedAnnotation;
19 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansGetterWithGeneratedAnnotation;
20 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansSetterWithGeneratedAnnotation;
21 import static org.mybatis.generator.internal.util.messages.Messages.getString;
22
23 import java.util.ArrayList;
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.Plugin;
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.JavaVisibility;
34 import org.mybatis.generator.api.dom.java.Method;
35 import org.mybatis.generator.api.dom.java.Parameter;
36 import org.mybatis.generator.api.dom.java.TopLevelClass;
37 import org.mybatis.generator.codegen.AbstractJavaGenerator;
38 import org.mybatis.generator.codegen.RootClassInfo;
39
40
41
42
43
44
45
46 public class DynamicSqlModelGenerator extends AbstractJavaGenerator {
47
48 public DynamicSqlModelGenerator(String project) {
49 super(project);
50 }
51
52 @Override
53 public List<CompilationUnit> getCompilationUnits() {
54 FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
55 progressCallback.startTask(getString("Progress.8", table.toString()));
56 Plugin plugins = context.getPlugins();
57 CommentGenerator commentGenerator = context.getCommentGenerator();
58
59 FullyQualifiedJavaType type = new FullyQualifiedJavaType(
60 introspectedTable.getBaseRecordType());
61 TopLevelClass topLevelClass = new TopLevelClass(type);
62 topLevelClass.setVisibility(JavaVisibility.PUBLIC);
63 commentGenerator.addJavaFileComment(topLevelClass);
64
65 FullyQualifiedJavaType superClass = getSuperClass();
66 if (superClass != null) {
67 topLevelClass.setSuperClass(superClass);
68 topLevelClass.addImportedType(superClass);
69 }
70
71 commentGenerator.addModelClassComment(topLevelClass, introspectedTable);
72
73 List<IntrospectedColumn> introspectedColumns = introspectedTable.getAllColumns();
74
75 if (introspectedTable.isConstructorBased()) {
76 addParameterizedConstructor(topLevelClass);
77
78 if (!introspectedTable.isImmutable()) {
79 addDefaultConstructorWithGeneratedAnnotatoin(topLevelClass);
80 }
81 }
82
83 String rootClass = getRootClass();
84 for (IntrospectedColumn introspectedColumn : introspectedColumns) {
85 if (RootClassInfo.getInstance(rootClass, warnings)
86 .containsProperty(introspectedColumn)) {
87 continue;
88 }
89
90 Field field = getJavaBeansFieldWithGeneratedAnnotation(introspectedColumn, context, introspectedTable,
91 topLevelClass);
92
93 if (plugins.modelFieldGenerated(field, topLevelClass,
94 introspectedColumn, introspectedTable,
95 Plugin.ModelClassType.BASE_RECORD)) {
96 topLevelClass.addField(field);
97 topLevelClass.addImportedType(field.getType());
98 }
99
100 Method method = getJavaBeansGetterWithGeneratedAnnotation(introspectedColumn, context, introspectedTable,
101 topLevelClass);
102 if (plugins.modelGetterMethodGenerated(method, topLevelClass,
103 introspectedColumn, introspectedTable,
104 Plugin.ModelClassType.BASE_RECORD)) {
105 topLevelClass.addMethod(method);
106 }
107
108 if (!introspectedTable.isImmutable()) {
109 method = getJavaBeansSetterWithGeneratedAnnotation(introspectedColumn, context, introspectedTable,
110 topLevelClass);
111 if (plugins.modelSetterMethodGenerated(method, topLevelClass,
112 introspectedColumn, introspectedTable,
113 Plugin.ModelClassType.BASE_RECORD)) {
114 topLevelClass.addMethod(method);
115 }
116 }
117 }
118
119 List<CompilationUnit> answer = new ArrayList<>();
120 if (context.getPlugins().modelBaseRecordClassGenerated(topLevelClass,
121 introspectedTable)) {
122 answer.add(topLevelClass);
123 }
124 return answer;
125 }
126
127 private FullyQualifiedJavaType getSuperClass() {
128 FullyQualifiedJavaType superClass;
129 String rootClass = getRootClass();
130 if (rootClass != null) {
131 superClass = new FullyQualifiedJavaType(rootClass);
132 } else {
133 superClass = null;
134 }
135
136 return superClass;
137 }
138
139 private void addParameterizedConstructor(TopLevelClass topLevelClass) {
140 Method method = new Method(topLevelClass.getType().getShortName());
141 method.setVisibility(JavaVisibility.PUBLIC);
142 method.setConstructor(true);
143 context.getCommentGenerator().addGeneralMethodAnnotation(method, introspectedTable,
144 topLevelClass.getImportedTypes());
145
146 List<IntrospectedColumn> constructorColumns = introspectedTable
147 .getAllColumns();
148
149 for (IntrospectedColumn introspectedColumn : constructorColumns) {
150 method.addParameter(new Parameter(introspectedColumn
151 .getFullyQualifiedJavaType(), introspectedColumn
152 .getJavaProperty()));
153 }
154
155 StringBuilder sb = new StringBuilder();
156 List<IntrospectedColumn> introspectedColumns = introspectedTable.getAllColumns();
157 for (IntrospectedColumn introspectedColumn : introspectedColumns) {
158 sb.setLength(0);
159 sb.append("this.");
160 sb.append(introspectedColumn.getJavaProperty());
161 sb.append(" = ");
162 sb.append(introspectedColumn.getJavaProperty());
163 sb.append(';');
164 method.addBodyLine(sb.toString());
165 }
166
167 topLevelClass.addMethod(method);
168 }
169 }