diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java index e1155a7..7a66b7c 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java @@ -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 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 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 methods = (ArrayList) 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方法。"); }