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;
import com.itfsw.mybatis.generator.plugins.utils.BasePlugin;
import com.itfsw.mybatis.generator.plugins.utils.JavaElementGeneratorTools;
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.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute;
......@@ -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.XmlElement;
import java.util.ArrayList;
import java.util.List;
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
/**
......@@ -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_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 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param interfaze
* @param topLevelClass
* @param introspectedTable
......@@ -62,10 +133,10 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// interface 增加方法
interfaze.addMethod(method);
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExample方法。");
logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExample方法。");
// 方法生成 selectOneByExampleWithBLOBs !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
if (introspectedTable.hasBLOBColumns()){
if (introspectedTable.hasBLOBColumns()) {
// 方法生成 selectOneByExample
Method method1 = JavaElementGeneratorTools.generateMethod(
METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS,
......@@ -77,7 +148,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// interface 增加方法
interfaze.addMethod(method1);
logger.debug("itfsw(查询单条数据插件):"+interfaze.getType().getShortName()+"增加selectOneByExampleWithBLOBs方法。");
logger.debug("itfsw(查询单条数据插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBs方法。");
}
return true;
......@@ -86,7 +157,6 @@ public class SelectOneByExamplePlugin extends BasePlugin {
/**
* SQL Map Methods 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param document
* @param introspectedTable
* @return
......@@ -105,37 +175,37 @@ public class SelectOneByExamplePlugin extends BasePlugin {
selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId()));
// 添加参数类型
selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
selectOneElement.addElement(new TextElement("select")); //$NON-NLS-1$
selectOneElement.addElement(new TextElement("select"));
StringBuilder sb = new StringBuilder();
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,"); //$NON-NLS-1$
sb.append("' as QUERYID,");
selectOneElement.addElement(new TextElement(sb.toString()));
}
selectOneElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable));
sb.setLength(0);
sb.append("from "); //$NON-NLS-1$
sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneElement.addElement(new TextElement(sb.toString()));
selectOneElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
ifElement.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
XmlElement ifElement = new XmlElement("if");
ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
ifElement.addElement(new TextElement("order by ${orderByClause}"));
selectOneElement.addElement(ifElement);
// 只查询一条
selectOneElement.addElement(new TextElement("limit 1"));
// 添加到根节点
document.getRootElement().addElement(selectOneElement);
logger.debug("itfsw(查询单条数据插件):"+introspectedTable.getMyBatis3XmlMapperFileName()+"增加selectOneByExample方法。");
logger.debug("itfsw(查询单条数据插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExample方法。");
// ------------------------------------ selectOneByExampleWithBLOBs ----------------------------------
// !!! 注意这里的行为不以有没有生成Model 的 WithBLOBs类为基准
if (introspectedTable.hasBLOBColumns()){
if (introspectedTable.hasBLOBColumns()) {
// 生成查询语句
XmlElement selectOneWithBLOBsElement = new XmlElement("select");
// 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated)
......@@ -148,13 +218,13 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// 添加参数类型
selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
// 添加查询SQL
selectOneWithBLOBsElement.addElement(new TextElement("select")); //$NON-NLS-1$
selectOneWithBLOBsElement.addElement(new TextElement("select"));
sb.setLength(0);
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,"); //$NON-NLS-1$
sb.append("' as QUERYID,");
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
}
......@@ -163,14 +233,14 @@ public class SelectOneByExamplePlugin extends BasePlugin {
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBlobColumnListElement(introspectedTable));
sb.setLength(0);
sb.append("from "); //$NON-NLS-1$
sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getExampleIncludeElement(introspectedTable));
XmlElement ifElement1 = new XmlElement("if"); //$NON-NLS-1$
ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
ifElement1.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
XmlElement ifElement1 = new XmlElement("if");
ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$
ifElement1.addElement(new TextElement("order by ${orderByClause}"));
selectOneWithBLOBsElement.addElement(ifElement1);
// 只查询一条
......@@ -178,7 +248,7 @@ public class SelectOneByExamplePlugin extends BasePlugin {
// 添加到根节点
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