From d0afad6fce565eaf4d46c636083fdaf71c2a6d3c Mon Sep 17 00:00:00 2001 From: hewei Date: Fri, 28 Jul 2017 11:19:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=98=E6=96=B9ConstructorBased=E9=85=8D?= =?UTF-8?q?=E7=BD=AEBUG=E4=B8=B4=E6=97=B6=E4=BF=AE=E6=AD=A3=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/ConstructorBasedBugFixPlugin.java | 104 ++++++++++++++++++ .../plugins/SelectOneByExamplePlugin.java | 72 ------------ 2 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/ConstructorBasedBugFixPlugin.java diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/ConstructorBasedBugFixPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/ConstructorBasedBugFixPlugin.java new file mode 100644 index 0000000..fed53cb --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/ConstructorBasedBugFixPlugin.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; +import com.itfsw.mybatis.generator.plugins.utils.FormatTools; +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.JavaVisibility; +import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.java.Parameter; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +import java.util.List; + +/** + * --------------------------------------------------------------------------- + * constructorBased 官方 bug 修正插件 + * --------------------------------------------------------------------------- + * @author: hewei + * @time:2017/7/28 11:05 + * --------------------------------------------------------------------------- + */ +public class ConstructorBasedBugFixPlugin extends BasePlugin { + + /** + * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html + * @param topLevelClass + * @param introspectedTable + * @return + */ + @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()); + } + + FormatTools.addMethodWithBestPosition(topLevelClass, method); + } + + return true; + } +} 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 6b52d3e..31e2ccc 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExamplePlugin.java @@ -20,7 +20,6 @@ import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; import com.itfsw.mybatis.generator.plugins.utils.FormatTools; 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; @@ -28,9 +27,6 @@ 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; /** @@ -45,74 +41,6 @@ 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