Commit 46d0b154 authored by hewei's avatar hewei

bug fixed: 有种情况下ModelBaseRecordClass不会生成不包含BLOBs的构造方法,造成selectOneByExample返回结果找不到对应的构造方法异常

parent e133a041
...@@ -19,6 +19,7 @@ package com.itfsw.mybatis.generator.plugins; ...@@ -19,6 +19,7 @@ package com.itfsw.mybatis.generator.plugins;
import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; import com.itfsw.mybatis.generator.plugins.utils.BasePlugin;
import com.itfsw.mybatis.generator.plugins.utils.JavaElementGeneratorTools; import com.itfsw.mybatis.generator.plugins.utils.JavaElementGeneratorTools;
import com.itfsw.mybatis.generator.plugins.utils.XmlElementGeneratorTools; import com.itfsw.mybatis.generator.plugins.utils.XmlElementGeneratorTools;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*; import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Attribute;
...@@ -26,6 +27,9 @@ import org.mybatis.generator.api.dom.xml.Document; ...@@ -26,6 +27,9 @@ import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement; import org.mybatis.generator.api.dom.xml.XmlElement;
import java.util.ArrayList;
import java.util.List;
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
/** /**
...@@ -40,10 +44,77 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -40,10 +44,77 @@ public class SelectOneByExamplePlugin extends BasePlugin {
public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectOneByExample"; // 方法名 public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectOneByExample"; // 方法名
public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectOneByExampleWithBLOBs"; // 方法名 public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectOneByExampleWithBLOBs"; // 方法名
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 有种情况下ModelBaseRecordClass不会生成不包含BLOBs的构造方法,造成selectOneByExample返回结果找不到对应的构造方法异常
if (introspectedTable.hasBLOBColumns() && !introspectedTable.getRules().generateRecordWithBLOBsClass()) {
// 添加没有BLOBs的构造方法
Method method = new Method();
method.setVisibility(JavaVisibility.PUBLIC);
method.setConstructor(true);
method.setName(topLevelClass.getType().getShortName());
commentGenerator.addGeneralMethodComment(method, introspectedTable);
// 使用没有blobs的字段
List<IntrospectedColumn> constructorColumns = introspectedTable.getNonBLOBColumns();
for (IntrospectedColumn introspectedColumn : constructorColumns) {
method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), introspectedColumn.getJavaProperty()));
topLevelClass.addImportedType(introspectedColumn.getFullyQualifiedJavaType());
}
StringBuilder sb = new StringBuilder();
if (introspectedTable.getRules().generatePrimaryKeyClass()) {
boolean comma = false;
sb.append("super(");
for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {
if (comma) {
sb.append(", ");
} else {
comma = true;
}
sb.append(introspectedColumn.getJavaProperty());
}
sb.append(");");
method.addBodyLine(sb.toString());
}
List<IntrospectedColumn> introspectedColumns;
if (!introspectedTable.getRules().generatePrimaryKeyClass() && introspectedTable.hasPrimaryKeyColumns()) {
introspectedColumns = introspectedTable.getNonBLOBColumns();
} else {
introspectedColumns = introspectedTable.getBaseColumns();
}
for (IntrospectedColumn introspectedColumn : introspectedColumns) {
sb.setLength(0);
sb.append("this.");
sb.append(introspectedColumn.getJavaProperty());
sb.append(" = ");
sb.append(introspectedColumn.getJavaProperty());
sb.append(';');
method.addBodyLine(sb.toString());
}
// 找到原有构造方法位置,保持构造方法放在一起美观
ArrayList<Method> methods = (ArrayList<Method>) topLevelClass.getMethods();
int index = 0;
for (Method m : methods) {
index++;
if (m.getName().equals(topLevelClass.getType().getShortName())) {
break;
}
}
methods.add(index, method);
}
return true;
}
/** /**
* Java Client Methods 生成 * Java Client Methods 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param interfaze * @param interfaze
* @param topLevelClass * @param topLevelClass
* @param introspectedTable * @param introspectedTable
...@@ -62,10 +133,10 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -62,10 +133,10 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// interface 增加方法 // interface 增加方法
interfaze.addMethod(method); interfaze.addMethod(method);
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExample方法。"); logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExample方法。");
// 方法生成 selectOneByExampleWithBLOBs !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准 // 方法生成 selectOneByExampleWithBLOBs !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
if (introspectedTable.hasBLOBColumns()){ if (introspectedTable.hasBLOBColumns()) {
// 方法生成 selectOneByExample // 方法生成 selectOneByExample
Method method1 = JavaElementGeneratorTools.generateMethod( Method method1 = JavaElementGeneratorTools.generateMethod(
METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS, METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS,
...@@ -77,7 +148,7 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -77,7 +148,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// interface 增加方法 // interface 增加方法
interfaze.addMethod(method1); interfaze.addMethod(method1);
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExampleWithBLOBs方法。"); logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBs方法。");
} }
return true; return true;
...@@ -86,7 +157,6 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -86,7 +157,6 @@ public class SelectOneByExamplePlugin extends BasePlugin {
/** /**
* SQL Map Methods 生成 * SQL Map Methods 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param document * @param document
* @param introspectedTable * @param introspectedTable
* @return * @return
...@@ -105,37 +175,37 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -105,37 +175,37 @@ public class SelectOneByExamplePlugin extends BasePlugin {
selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId())); selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId()));
// 添加参数类型 // 添加参数类型
selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
selectOneElement.addElement(new TextElement("select")); //$NON-NLS-1$ selectOneElement.addElement(new TextElement("select"));
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) { if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\''); sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId()); sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,"); //$NON-NLS-1$ sb.append("' as QUERYID,");
selectOneElement.addElement(new TextElement(sb.toString())); selectOneElement.addElement(new TextElement(sb.toString()));
} }
selectOneElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable)); selectOneElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable));
sb.setLength(0); sb.setLength(0);
sb.append("from "); //$NON-NLS-1$ sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()); sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneElement.addElement(new TextElement(sb.toString())); selectOneElement.addElement(new TextElement(sb.toString()));
selectOneElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable)); selectOneElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$ XmlElement ifElement = new XmlElement("if");
ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$ ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
ifElement.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$ ifElement.addElement(new TextElement("order by ${orderByClause}"));
selectOneElement.addElement(ifElement); selectOneElement.addElement(ifElement);
// 只查询一条 // 只查询一条
selectOneElement.addElement(new TextElement("limit 1")); selectOneElement.addElement(new TextElement("limit 1"));
// 添加到根节点 // 添加到根节点
document.getRootElement().addElement(selectOneElement); document.getRootElement().addElement(selectOneElement);
logger.debug("itfsw(查询单条数据插件):"+introspectedTable.getMyBatis3XmlMapperFileName()+"增加selectOneByExample方法。"); logger.debug("itfsw(查询单条数据插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExample方法。");
// ------------------------------------ selectOneByExampleWithBLOBs ---------------------------------- // ------------------------------------ selectOneByExampleWithBLOBs ----------------------------------
// !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准 // !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
if (introspectedTable.hasBLOBColumns()){ if (introspectedTable.hasBLOBColumns()) {
// 生成查询语句 // 生成查询语句
XmlElement selectOneWithBLOBsElement = new XmlElement("select"); XmlElement selectOneWithBLOBsElement = new XmlElement("select");
// 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated) // 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated)
...@@ -148,13 +218,13 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -148,13 +218,13 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// 添加参数类型 // 添加参数类型
selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
// 添加查询SQL // 添加查询SQL
selectOneWithBLOBsElement.addElement(new TextElement("select")); //$NON-NLS-1$ selectOneWithBLOBsElement.addElement(new TextElement("select"));
sb.setLength(0); sb.setLength(0);
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) { if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\''); sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId()); sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,"); //$NON-NLS-1$ sb.append("' as QUERYID,");
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString())); selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
} }
...@@ -163,14 +233,14 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -163,14 +233,14 @@ public class SelectOneByExamplePlugin extends BasePlugin {
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBlobColumnListElement(introspectedTable)); selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBlobColumnListElement(introspectedTable));
sb.setLength(0); sb.setLength(0);
sb.append("from "); //$NON-NLS-1$ sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()); sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString())); selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable)); selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
XmlElement ifElement1 = new XmlElement("if"); //$NON-NLS-1$ XmlElement ifElement1 = new XmlElement("if");
ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$ ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
ifElement1.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$ ifElement1.addElement(new TextElement("order by ${orderByClause}"));
selectOneWithBLOBsElement.addElement(ifElement1); selectOneWithBLOBsElement.addElement(ifElement1);
// 只查询一条 // 只查询一条
...@@ -178,7 +248,7 @@ public class SelectOneByExamplePlugin extends BasePlugin { ...@@ -178,7 +248,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// 添加到根节点 // 添加到根节点
document.getRootElement().addElement(selectOneWithBLOBsElement); document.getRootElement().addElement(selectOneWithBLOBsElement);
logger.debug("itfsw(查询单条数据插件):"+introspectedTable.getMyBatis3XmlMapperFileName()+"增加selectOneByExampleWithBLOBs方法。"); logger.debug("itfsw(查询单条数据插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBs方法。");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment