From 9425e882e74bd17d11bdbdec7ffd6cccc19da90a Mon Sep 17 00:00:00 2001 From: hewei Date: Sat, 28 Apr 2018 17:47:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E4=BE=9D=E8=B5=96=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/plugins/IncrementsPlugin.java | 148 ++++++++++++------ .../generator/plugins/ModelBuilderPlugin.java | 89 +---------- .../plugins/utils/hook/HookAggregator.java | 27 ++-- .../utils/hook/IModelBuilderPluginHook.java | 44 ++++++ 4 files changed, 167 insertions(+), 141 deletions(-) create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/IModelBuilderPluginHook.java diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java index acade52..8e14e05 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java @@ -17,12 +17,14 @@ package com.itfsw.mybatis.generator.plugins; import com.itfsw.mybatis.generator.plugins.utils.*; +import com.itfsw.mybatis.generator.plugins.utils.hook.IModelBuilderPluginHook; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; -import org.mybatis.generator.api.dom.java.TopLevelClass; +import org.mybatis.generator.api.dom.java.*; import org.mybatis.generator.api.dom.xml.Element; import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.XmlElement; +import org.mybatis.generator.internal.util.JavaBeansUtil; import java.util.ArrayList; import java.util.List; @@ -35,7 +37,7 @@ import java.util.List; * @time:2017/6/19 15:20 * --------------------------------------------------------------------------- */ -public class IncrementsPlugin extends BasePlugin { +public class IncrementsPlugin extends BasePlugin implements IModelBuilderPluginHook { public static final String PRO_INCREMENTS_COLUMNS = "incrementsColumns"; // incrementsColumns property public static final String FIELD_INC_MAP = "incrementsColumnsInfoMap"; // 为了防止和用户数据库字段冲突,特殊命名 public static final String METHOD_INC_CHECK = "hasIncsForColumn"; // inc 检查方法名称 @@ -64,33 +66,10 @@ public class IncrementsPlugin extends BasePlugin { */ @Override public void initialized(IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); this.incTools = IncrementsPluginTools.getTools(context, introspectedTable, warnings); } - /** - * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html - * @param topLevelClass - * @param introspectedTable - * @return - */ - @Override - public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { - // 具体实现在 ModelBuilderPlugin.generateModelBuilder - return true; - } - - /** - * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html - * @param topLevelClass - * @param introspectedTable - * @return - */ - @Override - public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { - // 具体实现在 ModelBuilderPlugin.generateModelBuilder - return true; - } - /** * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html * @param element @@ -99,13 +78,8 @@ public class IncrementsPlugin extends BasePlugin { */ @Override public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { - if (PluginTools.checkDependencyPlugin(context, SelectiveEnhancedPlugin.class)) { - // TODO SelectiveEnhancedPlugin.sqlMapUpdateByExampleSelectiveElementGenerated - } else { - generatedWithSelective(element, introspectedTable, true); - } - - return true; + generatedWithSelective(element, introspectedTable, true); + return super.sqlMapUpdateByExampleSelectiveElementGenerated(element, introspectedTable); } /** @@ -117,7 +91,7 @@ public class IncrementsPlugin extends BasePlugin { @Override public boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { generatedWithoutSelective(element, introspectedTable, true); - return true; + return super.sqlMapUpdateByExampleWithBLOBsElementGenerated(element, introspectedTable); } /** @@ -129,7 +103,7 @@ public class IncrementsPlugin extends BasePlugin { @Override public boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { generatedWithoutSelective(element, introspectedTable, true); - return true; + return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable); } /** @@ -140,13 +114,8 @@ public class IncrementsPlugin extends BasePlugin { */ @Override public boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { - if (PluginTools.checkDependencyPlugin(context, SelectiveEnhancedPlugin.class)) { - // TODO SelectiveEnhancedPlugin.sqlMapUpdateByPrimaryKeySelectiveElementGenerated - } else { - generatedWithSelective(element, introspectedTable, false); - } - - return true; + generatedWithSelective(element, introspectedTable, false); + return super.sqlMapUpdateByPrimaryKeySelectiveElementGenerated(element, introspectedTable); } /** @@ -158,7 +127,7 @@ public class IncrementsPlugin extends BasePlugin { @Override public boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { generatedWithoutSelective(element, introspectedTable, false); - return true; + return super.sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(element, introspectedTable); } /** @@ -170,9 +139,100 @@ public class IncrementsPlugin extends BasePlugin { @Override public boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { generatedWithoutSelective(element, introspectedTable, false); - return true; + return super.sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(element, introspectedTable); } + // =============================================== IModelBuilderPluginHook =================================================== + + /** + * Model builder class 生成 + * @param topLevelClass + * @param builderClass + * @param columns + * @param introspectedTable + * @return + */ + @Override + public boolean modelBuilderClassGenerated(TopLevelClass topLevelClass, InnerClass builderClass, List columns, IntrospectedTable introspectedTable) { + // 增加枚举 + InnerEnum eIncrements = new InnerEnum(new FullyQualifiedJavaType("Inc")); + eIncrements.setVisibility(JavaVisibility.PUBLIC); + eIncrements.setStatic(true); + eIncrements.addEnumConstant("INC(\"+\")"); + eIncrements.addEnumConstant("DEC(\"-\")"); + commentGenerator.addEnumComment(eIncrements, introspectedTable); + // 生成属性和构造函数 + Field fValue = new Field("value", FullyQualifiedJavaType.getStringInstance()); + fValue.setVisibility(JavaVisibility.PRIVATE); + fValue.setFinal(true); + commentGenerator.addFieldComment(fValue, introspectedTable); + eIncrements.addField(fValue); + + Method mInc = new Method("Inc"); + mInc.setConstructor(true); + mInc.addBodyLine("this.value = value;"); + mInc.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "value")); + commentGenerator.addGeneralMethodComment(mInc, introspectedTable); + eIncrements.addMethod(mInc); + + Method mValue = JavaElementGeneratorTools.generateGetterMethod(fValue); + commentGenerator.addGeneralMethodComment(mValue, introspectedTable); + eIncrements.addMethod(mValue); + + builderClass.addInnerEnum(eIncrements); + // 增加field + Field fIncrements = JavaElementGeneratorTools.generateField( + IncrementsPlugin.FIELD_INC_MAP, + JavaVisibility.PROTECTED, + new FullyQualifiedJavaType("Map"), + "new HashMap()" + ); + commentGenerator.addFieldComment(fIncrements, introspectedTable); + topLevelClass.addField(fIncrements); + topLevelClass.addImportedType("java.util.Map"); + topLevelClass.addImportedType("java.util.HashMap"); + // getter&setter + Method mGetter = JavaElementGeneratorTools.generateGetterMethod(fIncrements); + commentGenerator.addGetterComment(mGetter, introspectedTable, null); + topLevelClass.addMethod(mGetter); + Method mSetter = JavaElementGeneratorTools.generateSetterMethod(fIncrements); + commentGenerator.addSetterComment(mSetter, introspectedTable, null); + topLevelClass.addMethod(mSetter); + // 增加判断方法 + Method mHasIncsForColumn = JavaElementGeneratorTools.generateMethod( + IncrementsPlugin.METHOD_INC_CHECK, + JavaVisibility.PUBLIC, + FullyQualifiedJavaType.getBooleanPrimitiveInstance(), + new Parameter(FullyQualifiedJavaType.getStringInstance(), "column") + ); + commentGenerator.addGeneralMethodComment(mHasIncsForColumn, introspectedTable); + mHasIncsForColumn.addBodyLine("return " + IncrementsPlugin.FIELD_INC_MAP + ".get(column) != null;"); + FormatTools.addMethodWithBestPosition(topLevelClass, mHasIncsForColumn); + + // Builder 中 添加字段支持 + for (IntrospectedColumn column : columns) { + if (incTools.supportColumn(column)) { + Field field = JavaBeansUtil.getJavaBeansField(column, context, introspectedTable); + // 增加方法 + Method mIncrements = JavaElementGeneratorTools.generateMethod( + field.getName(), + JavaVisibility.PUBLIC, + builderClass.getType(), + new Parameter(field.getType(), field.getName()), + new Parameter(incTools.getIncEnum(), "inc") + ); + commentGenerator.addSetterComment(mIncrements, introspectedTable, column); + + Method setterMethod = JavaBeansUtil.getJavaBeansSetter(column, context, introspectedTable); + mIncrements.addBodyLine("obj." + IncrementsPlugin.FIELD_INC_MAP + ".put(\"" + column.getActualColumnName() + "\", inc);"); + mIncrements.addBodyLine("obj." + setterMethod.getName() + "(" + field.getName() + ");"); + mIncrements.addBodyLine("return this;"); + + FormatTools.addMethodWithBestPosition(builderClass, mIncrements); + } + } + return true; + } /** * 有Selective代码生成 diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java index 8e26e68..f4aaefa 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java @@ -17,10 +17,10 @@ package com.itfsw.mybatis.generator.plugins; import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; -import com.itfsw.mybatis.generator.plugins.utils.FormatTools; -import com.itfsw.mybatis.generator.plugins.utils.IncrementsPluginTools; import com.itfsw.mybatis.generator.plugins.utils.JavaElementGeneratorTools; +import com.itfsw.mybatis.generator.plugins.utils.PluginTools; import com.itfsw.mybatis.generator.plugins.utils.enhanced.InnerTypeFullyQualifiedJavaType; +import com.itfsw.mybatis.generator.plugins.utils.hook.IModelBuilderPluginHook; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.*; @@ -163,91 +163,10 @@ public class ModelBuilderPlugin extends BasePlugin { build.addBodyLine("return this.obj;"); commentGenerator.addGeneralMethodComment(build, introspectedTable); innerClass.addMethod(build); - logger.debug("itfsw(数据Model链式构建插件):" + topLevelClass.getType().getShortName() + ".Builder增加build方法。"); - - // ========================================== IncrementsPlugin ======================================= - IncrementsPluginTools incTools = IncrementsPluginTools.getTools(context, introspectedTable, warnings); - if (incTools.support()) { - // 增加枚举 - InnerEnum eIncrements = new InnerEnum(new FullyQualifiedJavaType("Inc")); - eIncrements.setVisibility(JavaVisibility.PUBLIC); - eIncrements.setStatic(true); - eIncrements.addEnumConstant("INC(\"+\")"); - eIncrements.addEnumConstant("DEC(\"-\")"); - commentGenerator.addEnumComment(eIncrements, introspectedTable); - // 生成属性和构造函数 - Field fValue = new Field("value", FullyQualifiedJavaType.getStringInstance()); - fValue.setVisibility(JavaVisibility.PRIVATE); - fValue.setFinal(true); - commentGenerator.addFieldComment(fValue, introspectedTable); - eIncrements.addField(fValue); - - Method mInc = new Method("Inc"); - mInc.setConstructor(true); - mInc.addBodyLine("this.value = value;"); - mInc.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "value")); - commentGenerator.addGeneralMethodComment(mInc, introspectedTable); - eIncrements.addMethod(mInc); - - Method mValue = JavaElementGeneratorTools.generateGetterMethod(fValue); - commentGenerator.addGeneralMethodComment(mValue, introspectedTable); - eIncrements.addMethod(mValue); - - innerClass.addInnerEnum(eIncrements); - // 增加field - Field fIncrements = JavaElementGeneratorTools.generateField( - IncrementsPlugin.FIELD_INC_MAP, - JavaVisibility.PROTECTED, - new FullyQualifiedJavaType("Map"), - "new HashMap()" - ); - commentGenerator.addFieldComment(fIncrements, introspectedTable); - topLevelClass.addField(fIncrements); - topLevelClass.addImportedType("java.util.Map"); - topLevelClass.addImportedType("java.util.HashMap"); - // getter&setter - Method mGetter = JavaElementGeneratorTools.generateGetterMethod(fIncrements); - commentGenerator.addGetterComment(mGetter, introspectedTable, null); - topLevelClass.addMethod(mGetter); - Method mSetter = JavaElementGeneratorTools.generateSetterMethod(fIncrements); - commentGenerator.addSetterComment(mSetter, introspectedTable, null); - topLevelClass.addMethod(mSetter); - // 增加判断方法 - Method mHasIncsForColumn = JavaElementGeneratorTools.generateMethod( - IncrementsPlugin.METHOD_INC_CHECK, - JavaVisibility.PUBLIC, - FullyQualifiedJavaType.getBooleanPrimitiveInstance(), - new Parameter(FullyQualifiedJavaType.getStringInstance(), "column") - ); - commentGenerator.addGeneralMethodComment(mHasIncsForColumn, introspectedTable); - mHasIncsForColumn.addBodyLine("return " + IncrementsPlugin.FIELD_INC_MAP + ".get(column) != null;"); - FormatTools.addMethodWithBestPosition(topLevelClass, mHasIncsForColumn); - - // Builder 中 添加字段支持 - for (IntrospectedColumn column : columns) { - if (incTools.supportColumn(column)) { - Field field = JavaBeansUtil.getJavaBeansField(column, context, introspectedTable); - // 增加方法 - Method mIncrements = JavaElementGeneratorTools.generateMethod( - field.getName(), - JavaVisibility.PUBLIC, - innerClass.getType(), - new Parameter(field.getType(), field.getName()), - new Parameter(incTools.getIncEnum(), "inc") - ); - commentGenerator.addSetterComment(mIncrements, introspectedTable, column); - - Method setterMethod = JavaBeansUtil.getJavaBeansSetter(column, context, introspectedTable); - mIncrements.addBodyLine("obj." + IncrementsPlugin.FIELD_INC_MAP + ".put(\"" + column.getActualColumnName() + "\", inc);"); - mIncrements.addBodyLine("obj." + setterMethod.getName() + "(" + field.getName() + ");"); - mIncrements.addBodyLine("return this;"); - - FormatTools.addMethodWithBestPosition(innerClass, mIncrements); - } - } - } + // hook + PluginTools.getHook(IModelBuilderPluginHook.class).modelBuilderClassGenerated(topLevelClass, innerClass, columns, introspectedTable); return innerClass; } diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/HookAggregator.java b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/HookAggregator.java index 042b77c..39cced6 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/HookAggregator.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/HookAggregator.java @@ -20,8 +20,10 @@ import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.Plugin; +import org.mybatis.generator.api.dom.java.InnerClass; import org.mybatis.generator.api.dom.java.Interface; import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.java.TopLevelClass; import org.mybatis.generator.api.dom.xml.XmlElement; import org.mybatis.generator.config.Context; import org.slf4j.Logger; @@ -38,7 +40,7 @@ import java.util.List; * @time:2018/4/27 11:33 * --------------------------------------------------------------------------- */ -public class HookAggregator implements IUpsertPluginHook { +public class HookAggregator implements IUpsertPluginHook, IModelBuilderPluginHook { protected static final Logger logger = LoggerFactory.getLogger(BasePlugin.class); // 日志 private final static HookAggregator instance = new HookAggregator(); private Context context; @@ -67,16 +69,6 @@ public class HookAggregator implements IUpsertPluginHook { this.context = context; } - /** - * 获取挂载 - * @param clazz - * @param - * @return - */ - public T getHook(Class clazz) { - return (T) this; - } - /** * 获取插件 * @param clazz @@ -101,7 +93,18 @@ public class HookAggregator implements IUpsertPluginHook { return list; } - // ================================================= default =============================================== + // ============================================ IModelBuilderPluginHook ============================================= + @Override + public boolean modelBuilderClassGenerated(TopLevelClass topLevelClass, InnerClass builderClass, List columns, IntrospectedTable introspectedTable) { + for (IModelBuilderPluginHook plugin : this.getPlugins(IModelBuilderPluginHook.class)) { + if (!plugin.modelBuilderClassGenerated(topLevelClass, builderClass, columns, introspectedTable)) { + return false; + } + } + return true; + } + + // ================================================= IUpsertPluginHook =============================================== @Override public boolean clientUpsertSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { for (IUpsertPluginHook plugin : this.getPlugins(IUpsertPluginHook.class)) { diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/IModelBuilderPluginHook.java b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/IModelBuilderPluginHook.java new file mode 100644 index 0000000..2473efd --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/hook/IModelBuilderPluginHook.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018. + * + * 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.utils.hook; + +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.InnerClass; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +import java.util.List; + +/** + * --------------------------------------------------------------------------- + * + * --------------------------------------------------------------------------- + * @author: hewei + * @time:2018/4/28 17:29 + * --------------------------------------------------------------------------- + */ +public interface IModelBuilderPluginHook { + /** + * Model builder class 生成 + * @param topLevelClass + * @param builderClass + * @param columns + * @param introspectedTable + * @return + */ + boolean modelBuilderClassGenerated(TopLevelClass topLevelClass, InnerClass builderClass, List columns, IntrospectedTable introspectedTable); +}