From 62bdfb4af96badec4cc281137966d67c97273359 Mon Sep 17 00:00:00 2001 From: hewei Date: Mon, 7 Aug 2017 11:57:53 +0800 Subject: [PATCH] =?UTF-8?q?ModelBuilderPlugin=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=9D=99=E6=80=81builder=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/plugins/ModelBuilderPlugin.java | 113 +++++++++--------- .../plugins/IncrementsPluginTest.java | 32 +++-- .../plugins/ModelBuilderPluginTest.java | 85 +++++++++++++ .../scripts/ModelBuilderPlugin/init.sql | 19 +++ .../ModelBuilderPlugin/mybatis-generator.xml | 1 + 5 files changed, 185 insertions(+), 65 deletions(-) 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 f30b004..8e26e68 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPlugin.java @@ -53,7 +53,7 @@ public class ModelBuilderPlugin extends BasePlugin { public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { // 判断是否有生成Model的WithBLOBs类 List columns = introspectedTable.getRules().generateRecordWithBLOBsClass() ? introspectedTable.getNonBLOBColumns() : introspectedTable.getAllColumns(); - InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, columns, true); + InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, columns); topLevelClass.addInnerClass(innerClass); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); } @@ -67,7 +67,7 @@ public class ModelBuilderPlugin extends BasePlugin { */ @Override public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { - InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, introspectedTable.getAllColumns(), false); + InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, introspectedTable.getAllColumns()); topLevelClass.addInnerClass(innerClass); return super.modelRecordWithBLOBsClassGenerated(topLevelClass, introspectedTable); } @@ -80,7 +80,7 @@ public class ModelBuilderPlugin extends BasePlugin { */ @Override public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { - InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, introspectedTable.getPrimaryKeyColumns(), false); + InnerClass innerClass = this.generateModelBuilder(topLevelClass, introspectedTable, introspectedTable.getPrimaryKeyColumns()); topLevelClass.addInnerClass(innerClass); return super.modelPrimaryKeyClassGenerated(topLevelClass, introspectedTable); } @@ -90,10 +90,9 @@ public class ModelBuilderPlugin extends BasePlugin { * @param topLevelClass * @param introspectedTable * @param columns - * @param modelBaseRecord * @return */ - private InnerClass generateModelBuilder(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, List columns, boolean modelBaseRecord) { + private InnerClass generateModelBuilder(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, List columns) { // 生成内部Builder类 InnerClass innerClass = new InnerClass(BUILDER_CLASS_NAME); innerClass.setVisibility(JavaVisibility.PUBLIC); @@ -171,62 +170,60 @@ public class ModelBuilderPlugin extends BasePlugin { // ========================================== IncrementsPlugin ======================================= IncrementsPluginTools incTools = IncrementsPluginTools.getTools(context, introspectedTable, warnings); if (incTools.support()) { - if (modelBaseRecord) { - // 增加枚举 - 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); + // 增加枚举 + 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 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); + 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); - } + 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) { diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/IncrementsPluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/IncrementsPluginTest.java index 29b3238..797d209 100644 --- a/src/test/java/com/itfsw/mybatis/generator/plugins/IncrementsPluginTest.java +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/IncrementsPluginTest.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; /** @@ -70,7 +71,7 @@ public class IncrementsPluginTest { public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { // 1. 测试生成的方法 ObjectUtil tbBuilder = new ObjectUtil(loader, packagz + ".Tb$Builder"); - List methods = tbBuilder.getMethods("incF1"); + List methods = getDeclaredMethods(tbBuilder.getCls(), "incF1"); Assert.assertEquals(methods.size(), 2); // 自增方法 Method incMethod = methods.get(0).getParameterTypes().length == 1 ? methods.get(1) : methods.get(0); @@ -78,19 +79,36 @@ public class IncrementsPluginTest { // 2. 测试有空格 ObjectUtil tbKeysBuilder = new ObjectUtil(loader, packagz + ".TbKeys$Builder"); - Assert.assertEquals(tbKeysBuilder.getMethods("incF1").size(), 2); - Assert.assertEquals(tbKeysBuilder.getMethods("incF2").size(), 2); - Assert.assertEquals(tbKeysBuilder.getMethods("incF3").size(), 2); + Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF1").size(), 2); + Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF2").size(), 2); + Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF3").size(), 2); // 3. 测试在WithBlobs正确生成 ObjectUtil tbBlobsWithBLOBs = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Builder"); - Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF1").size(), 2); - Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF2").size(), 1); - Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF3").size(), 2); + Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF1").size(), 2); + Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF2").size(), 1); + Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF3").size(), 2); } }); } + /** + * 获取类方法 + * @param cls + * @param name + * @return + */ + private List getDeclaredMethods(Class cls, String name) { + List list = new ArrayList<>(); + Method[] methods = cls.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(name) && cls.equals(method.getReturnType())) { + list.add(method); + } + } + return list; + } + /** * 测试生成的sql和具体执行 */ diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPluginTest.java index 9833a1b..3ab5ed2 100644 --- a/src/test/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPluginTest.java +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/ModelBuilderPluginTest.java @@ -89,6 +89,91 @@ public class ModelBuilderPluginTest { ObjectUtil tbKeys = new ObjectUtil(tbKeysBuilder.invoke("build")); Assert.assertEquals(tbKeys.invoke("getKey1"), 50l); Assert.assertEquals(tbKeys.invoke("getField1"), "ts2"); + + // 4. key and blobs + ObjectUtil TbKeysBlobsKeyBuilder = new ObjectUtil(loader, packagz + ".TbKeysBlobsKey$Builder"); + TbKeysBlobsKeyBuilder.invoke("key1", 60l); + ObjectUtil TbKeysBlobsKey = new ObjectUtil(TbKeysBlobsKeyBuilder.invoke("build")); + Assert.assertEquals(TbKeysBlobsKey.invoke("getKey1"), 60l); + + ObjectUtil TbKeysBlobsWithBLOBsBuilder = new ObjectUtil(loader, packagz + ".TbKeysBlobsWithBLOBs$Builder"); + TbKeysBlobsWithBLOBsBuilder.invoke("key1", 90l); + TbKeysBlobsWithBLOBsBuilder.invoke("incF2", 70l); + TbKeysBlobsWithBLOBsBuilder.invoke("field2", "ts3"); + + ObjectUtil TbKeysBlobsWithBLOBs = new ObjectUtil(TbKeysBlobsWithBLOBsBuilder.invoke("build")); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getKey1"), 90l); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getIncF2"), 70l); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getField2"), "ts3"); + } + }); + } + + /** + * 测试静态builder方法 + */ + @Test + public void testBuilderMethod() throws IOException, XMLParserException, InvalidConfigurationException, InterruptedException, SQLException { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/ModelBuilderPlugin/mybatis-generator.xml"); + tool.generate(new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + // 1. 普通model + ObjectUtil Tb = new ObjectUtil(loader, packagz + ".Tb"); + ObjectUtil tbBuilder = new ObjectUtil(Tb.invoke("builder")); + tbBuilder.invoke("field1", "ts1"); + tbBuilder.invoke("incF1", 100l); + ObjectUtil tb = new ObjectUtil(tbBuilder.invoke("build")); + Assert.assertEquals(tb.invoke("getField1"), "ts1"); + Assert.assertEquals(tb.invoke("getIncF1"), 100l); + + // 2. withBlobs + ObjectUtil TbBlobs = new ObjectUtil(loader, packagz + ".TbBlobs"); + ObjectUtil tbBlobsBuilder = new ObjectUtil(TbBlobs.invoke("builder")); + tbBlobsBuilder.invoke("field1", "ts1"); + ObjectUtil tbBlobs = new ObjectUtil(tbBlobsBuilder.invoke("build")); + Assert.assertEquals(tbBlobs.invoke("getField1"), "ts1"); + + ObjectUtil TbBlobsWithBLOBs= new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs"); + ObjectUtil tbBlobsWithBLOBsBuilder = new ObjectUtil(TbBlobsWithBLOBs.invoke("builder")); + tbBlobsWithBLOBsBuilder.invoke("field1", "ts1"); + tbBlobsWithBLOBsBuilder.invoke("field2", "ts2"); + ObjectUtil tbBlobsWithBLOBs = new ObjectUtil(tbBlobsWithBLOBsBuilder.invoke("build")); + Assert.assertEquals(tbBlobsWithBLOBs.invoke("getField1"), "ts1"); + Assert.assertEquals(tbBlobsWithBLOBs.invoke("getField2"), "ts2"); + + // 3. key + ObjectUtil TbKeysKey = new ObjectUtil(loader, packagz + ".TbKeysKey"); + ObjectUtil tbKeysKeyBuilder = new ObjectUtil(TbKeysKey.invoke("builder")); + tbKeysKeyBuilder.invoke("key1", 60l); + ObjectUtil tbKeysKey = new ObjectUtil(tbKeysKeyBuilder.invoke("build")); + Assert.assertEquals(tbKeysKey.invoke("getKey1"), 60l); + + ObjectUtil TbKeys = new ObjectUtil(loader, packagz + ".TbKeys"); + ObjectUtil tbKeysBuilder = new ObjectUtil(TbKeys.invoke("builder")); + tbKeysBuilder.invoke("key1", 50l); + tbKeysBuilder.invoke("field1", "ts2"); + ObjectUtil tbKeys = new ObjectUtil(tbKeysBuilder.invoke("build")); + Assert.assertEquals(tbKeys.invoke("getKey1"), 50l); + Assert.assertEquals(tbKeys.invoke("getField1"), "ts2"); + + // 4. key and blobs + ObjectUtil TbKeysBlobsKey = new ObjectUtil(loader, packagz + ".TbKeysBlobsKey"); + ObjectUtil TbKeysBlobsKeyBuilder = new ObjectUtil(TbKeysBlobsKey.invoke("builder")); + TbKeysBlobsKeyBuilder.invoke("key1", 60l); + ObjectUtil tbKeysBlobsKey = new ObjectUtil(TbKeysBlobsKeyBuilder.invoke("build")); + Assert.assertEquals(tbKeysBlobsKey.invoke("getKey1"), 60l); + + ObjectUtil TbKeysBlobsWithBLOBs = new ObjectUtil(loader, packagz + ".TbKeysBlobsWithBLOBs"); + ObjectUtil TbKeysBlobsWithBLOBsBuilder = new ObjectUtil(TbKeysBlobsWithBLOBs.invoke("builder")); + TbKeysBlobsWithBLOBsBuilder.invoke("key1", 90l); + TbKeysBlobsWithBLOBsBuilder.invoke("incF2", 70l); + TbKeysBlobsWithBLOBsBuilder.invoke("field2", "ts3"); + + TbKeysBlobsWithBLOBs = new ObjectUtil(TbKeysBlobsWithBLOBsBuilder.invoke("build")); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getKey1"), 90l); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getIncF2"), 70l); + Assert.assertEquals(TbKeysBlobsWithBLOBs.invoke("getField2"), "ts3"); } }); } diff --git a/src/test/resources/scripts/ModelBuilderPlugin/init.sql b/src/test/resources/scripts/ModelBuilderPlugin/init.sql index b736371..8b84179 100644 --- a/src/test/resources/scripts/ModelBuilderPlugin/init.sql +++ b/src/test/resources/scripts/ModelBuilderPlugin/init.sql @@ -70,3 +70,22 @@ CREATE TABLE `tb_keys` ( -- Records of tb_keys -- ---------------------------- +-- ---------------------------- +-- Table structure for tb_keys_blobs +-- ---------------------------- +DROP TABLE IF EXISTS `tb_keys_blobs`; +CREATE TABLE `tb_keys_blobs` ( + `key1` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `key2` varchar(255) NOT NULL, + `field1` varchar(255) DEFAULT NULL COMMENT '注释2', + `field2` longtext COMMENT '注释2', + `field3` longtext, + `inc_f2` bigint(20) NOT NULL DEFAULT '0', + `inc_f3` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`key1`,`key2`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb_keys +-- ---------------------------- + diff --git a/src/test/resources/scripts/ModelBuilderPlugin/mybatis-generator.xml b/src/test/resources/scripts/ModelBuilderPlugin/mybatis-generator.xml index f8a83b3..a584e33 100644 --- a/src/test/resources/scripts/ModelBuilderPlugin/mybatis-generator.xml +++ b/src/test/resources/scripts/ModelBuilderPlugin/mybatis-generator.xml @@ -49,5 +49,6 @@
+ \ No newline at end of file