Commit 62bdfb4a authored by hewei's avatar hewei

ModelBuilderPlugin 增加静态builder方法

parent 0a4f6162
...@@ -53,7 +53,7 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -53,7 +53,7 @@ public class ModelBuilderPlugin extends BasePlugin {
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 判断是否有生成Model的WithBLOBs类 // 判断是否有生成Model的WithBLOBs类
List<IntrospectedColumn> columns = introspectedTable.getRules().generateRecordWithBLOBsClass() ? introspectedTable.getNonBLOBColumns() : introspectedTable.getAllColumns(); List<IntrospectedColumn> 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); topLevelClass.addInnerClass(innerClass);
return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable);
} }
...@@ -67,7 +67,7 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -67,7 +67,7 @@ public class ModelBuilderPlugin extends BasePlugin {
*/ */
@Override @Override
public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { 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); topLevelClass.addInnerClass(innerClass);
return super.modelRecordWithBLOBsClassGenerated(topLevelClass, introspectedTable); return super.modelRecordWithBLOBsClassGenerated(topLevelClass, introspectedTable);
} }
...@@ -80,7 +80,7 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -80,7 +80,7 @@ public class ModelBuilderPlugin extends BasePlugin {
*/ */
@Override @Override
public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { 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); topLevelClass.addInnerClass(innerClass);
return super.modelPrimaryKeyClassGenerated(topLevelClass, introspectedTable); return super.modelPrimaryKeyClassGenerated(topLevelClass, introspectedTable);
} }
...@@ -90,10 +90,9 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -90,10 +90,9 @@ public class ModelBuilderPlugin extends BasePlugin {
* @param topLevelClass * @param topLevelClass
* @param introspectedTable * @param introspectedTable
* @param columns * @param columns
* @param modelBaseRecord
* @return * @return
*/ */
private InnerClass generateModelBuilder(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, List<IntrospectedColumn> columns, boolean modelBaseRecord) { private InnerClass generateModelBuilder(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, List<IntrospectedColumn> columns) {
// 生成内部Builder类 // 生成内部Builder类
InnerClass innerClass = new InnerClass(BUILDER_CLASS_NAME); InnerClass innerClass = new InnerClass(BUILDER_CLASS_NAME);
innerClass.setVisibility(JavaVisibility.PUBLIC); innerClass.setVisibility(JavaVisibility.PUBLIC);
...@@ -171,62 +170,60 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -171,62 +170,60 @@ public class ModelBuilderPlugin extends BasePlugin {
// ========================================== IncrementsPlugin ======================================= // ========================================== IncrementsPlugin =======================================
IncrementsPluginTools incTools = IncrementsPluginTools.getTools(context, introspectedTable, warnings); IncrementsPluginTools incTools = IncrementsPluginTools.getTools(context, introspectedTable, warnings);
if (incTools.support()) { if (incTools.support()) {
if (modelBaseRecord) { // 增加枚举
// 增加枚举 InnerEnum eIncrements = new InnerEnum(new FullyQualifiedJavaType("Inc"));
InnerEnum eIncrements = new InnerEnum(new FullyQualifiedJavaType("Inc")); eIncrements.setVisibility(JavaVisibility.PUBLIC);
eIncrements.setVisibility(JavaVisibility.PUBLIC); eIncrements.setStatic(true);
eIncrements.setStatic(true); eIncrements.addEnumConstant("INC(\"+\")");
eIncrements.addEnumConstant("INC(\"+\")"); eIncrements.addEnumConstant("DEC(\"-\")");
eIncrements.addEnumConstant("DEC(\"-\")"); commentGenerator.addEnumComment(eIncrements, introspectedTable);
commentGenerator.addEnumComment(eIncrements, introspectedTable); // 生成属性和构造函数
// 生成属性和构造函数 Field fValue = new Field("value", FullyQualifiedJavaType.getStringInstance());
Field fValue = new Field("value", FullyQualifiedJavaType.getStringInstance()); fValue.setVisibility(JavaVisibility.PRIVATE);
fValue.setVisibility(JavaVisibility.PRIVATE); fValue.setFinal(true);
fValue.setFinal(true); commentGenerator.addFieldComment(fValue, introspectedTable);
commentGenerator.addFieldComment(fValue, introspectedTable); eIncrements.addField(fValue);
eIncrements.addField(fValue);
Method mInc = new Method("Inc");
Method mInc = new Method("Inc"); mInc.setConstructor(true);
mInc.setConstructor(true); mInc.addBodyLine("this.value = value;");
mInc.addBodyLine("this.value = value;"); mInc.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "value"));
mInc.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "value")); commentGenerator.addGeneralMethodComment(mInc, introspectedTable);
commentGenerator.addGeneralMethodComment(mInc, introspectedTable); eIncrements.addMethod(mInc);
eIncrements.addMethod(mInc);
Method mValue = JavaElementGeneratorTools.generateGetterMethod(fValue);
Method mValue = JavaElementGeneratorTools.generateGetterMethod(fValue); commentGenerator.addGeneralMethodComment(mValue, introspectedTable);
commentGenerator.addGeneralMethodComment(mValue, introspectedTable); eIncrements.addMethod(mValue);
eIncrements.addMethod(mValue);
innerClass.addInnerEnum(eIncrements);
innerClass.addInnerEnum(eIncrements); // 增加field
// 增加field Field fIncrements = JavaElementGeneratorTools.generateField(
Field fIncrements = JavaElementGeneratorTools.generateField( IncrementsPlugin.FIELD_INC_MAP,
IncrementsPlugin.FIELD_INC_MAP, JavaVisibility.PROTECTED,
JavaVisibility.PROTECTED, new FullyQualifiedJavaType("Map<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">"),
new FullyQualifiedJavaType("Map<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">"), "new HashMap<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">()"
"new HashMap<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">()" );
); commentGenerator.addFieldComment(fIncrements, introspectedTable);
commentGenerator.addFieldComment(fIncrements, introspectedTable); topLevelClass.addField(fIncrements);
topLevelClass.addField(fIncrements); topLevelClass.addImportedType("java.util.Map");
topLevelClass.addImportedType("java.util.Map"); topLevelClass.addImportedType("java.util.HashMap");
topLevelClass.addImportedType("java.util.HashMap"); // getter&setter
// getter&setter Method mGetter = JavaElementGeneratorTools.generateGetterMethod(fIncrements);
Method mGetter = JavaElementGeneratorTools.generateGetterMethod(fIncrements); commentGenerator.addGetterComment(mGetter, introspectedTable, null);
commentGenerator.addGetterComment(mGetter, introspectedTable, null); topLevelClass.addMethod(mGetter);
topLevelClass.addMethod(mGetter); Method mSetter = JavaElementGeneratorTools.generateSetterMethod(fIncrements);
Method mSetter = JavaElementGeneratorTools.generateSetterMethod(fIncrements); commentGenerator.addSetterComment(mSetter, introspectedTable, null);
commentGenerator.addSetterComment(mSetter, introspectedTable, null); topLevelClass.addMethod(mSetter);
topLevelClass.addMethod(mSetter); // 增加判断方法
// 增加判断方法 Method mHasIncsForColumn = JavaElementGeneratorTools.generateMethod(
Method mHasIncsForColumn = JavaElementGeneratorTools.generateMethod( IncrementsPlugin.METHOD_INC_CHECK,
IncrementsPlugin.METHOD_INC_CHECK, JavaVisibility.PUBLIC,
JavaVisibility.PUBLIC, FullyQualifiedJavaType.getBooleanPrimitiveInstance(),
FullyQualifiedJavaType.getBooleanPrimitiveInstance(), new Parameter(FullyQualifiedJavaType.getStringInstance(), "column")
new Parameter(FullyQualifiedJavaType.getStringInstance(), "column") );
); commentGenerator.addGeneralMethodComment(mHasIncsForColumn, introspectedTable);
commentGenerator.addGeneralMethodComment(mHasIncsForColumn, introspectedTable); mHasIncsForColumn.addBodyLine("return " + IncrementsPlugin.FIELD_INC_MAP + ".get(column) != null;");
mHasIncsForColumn.addBodyLine("return " + IncrementsPlugin.FIELD_INC_MAP + ".get(column) != null;"); FormatTools.addMethodWithBestPosition(topLevelClass, mHasIncsForColumn);
FormatTools.addMethodWithBestPosition(topLevelClass, mHasIncsForColumn);
}
// Builder 中 添加字段支持 // Builder 中 添加字段支持
for (IntrospectedColumn column : columns) { for (IntrospectedColumn column : columns) {
......
...@@ -28,6 +28,7 @@ import java.io.IOException; ...@@ -28,6 +28,7 @@ import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -70,7 +71,7 @@ public class IncrementsPluginTest { ...@@ -70,7 +71,7 @@ public class IncrementsPluginTest {
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
// 1. 测试生成的方法 // 1. 测试生成的方法
ObjectUtil tbBuilder = new ObjectUtil(loader, packagz + ".Tb$Builder"); ObjectUtil tbBuilder = new ObjectUtil(loader, packagz + ".Tb$Builder");
List<Method> methods = tbBuilder.getMethods("incF1"); List<Method> methods = getDeclaredMethods(tbBuilder.getCls(), "incF1");
Assert.assertEquals(methods.size(), 2); Assert.assertEquals(methods.size(), 2);
// 自增方法 // 自增方法
Method incMethod = methods.get(0).getParameterTypes().length == 1 ? methods.get(1) : methods.get(0); Method incMethod = methods.get(0).getParameterTypes().length == 1 ? methods.get(1) : methods.get(0);
...@@ -78,19 +79,36 @@ public class IncrementsPluginTest { ...@@ -78,19 +79,36 @@ public class IncrementsPluginTest {
// 2. 测试有空格 // 2. 测试有空格
ObjectUtil tbKeysBuilder = new ObjectUtil(loader, packagz + ".TbKeys$Builder"); ObjectUtil tbKeysBuilder = new ObjectUtil(loader, packagz + ".TbKeys$Builder");
Assert.assertEquals(tbKeysBuilder.getMethods("incF1").size(), 2); Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF1").size(), 2);
Assert.assertEquals(tbKeysBuilder.getMethods("incF2").size(), 2); Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF2").size(), 2);
Assert.assertEquals(tbKeysBuilder.getMethods("incF3").size(), 2); Assert.assertEquals(getDeclaredMethods(tbKeysBuilder.getCls(), "incF3").size(), 2);
// 3. 测试在WithBlobs正确生成 // 3. 测试在WithBlobs正确生成
ObjectUtil tbBlobsWithBLOBs = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Builder"); ObjectUtil tbBlobsWithBLOBs = new ObjectUtil(loader, packagz + ".TbBlobsWithBLOBs$Builder");
Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF1").size(), 2); Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF1").size(), 2);
Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF2").size(), 1); Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF2").size(), 1);
Assert.assertEquals(tbBlobsWithBLOBs.getMethods("incF3").size(), 2); Assert.assertEquals(getDeclaredMethods(tbBlobsWithBLOBs.getCls(), "incF3").size(), 2);
} }
}); });
} }
/**
* 获取类方法
* @param cls
* @param name
* @return
*/
private List<Method> getDeclaredMethods(Class cls, String name) {
List<Method> 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和具体执行 * 测试生成的sql和具体执行
*/ */
......
...@@ -89,6 +89,91 @@ public class ModelBuilderPluginTest { ...@@ -89,6 +89,91 @@ public class ModelBuilderPluginTest {
ObjectUtil tbKeys = new ObjectUtil(tbKeysBuilder.invoke("build")); ObjectUtil tbKeys = new ObjectUtil(tbKeysBuilder.invoke("build"));
Assert.assertEquals(tbKeys.invoke("getKey1"), 50l); Assert.assertEquals(tbKeys.invoke("getKey1"), 50l);
Assert.assertEquals(tbKeys.invoke("getField1"), "ts2"); 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");
} }
}); });
} }
......
...@@ -70,3 +70,22 @@ CREATE TABLE `tb_keys` ( ...@@ -70,3 +70,22 @@ CREATE TABLE `tb_keys` (
-- Records of 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
-- ----------------------------
...@@ -49,5 +49,6 @@ ...@@ -49,5 +49,6 @@
<table tableName="tb_blobs"> <table tableName="tb_blobs">
<generatedKey column="id" sqlStatement="MySql" identity="true"/> <generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table> </table>
<table tableName="tb_keys_blobs"/>
</context> </context>
</generatorConfiguration> </generatorConfiguration>
\ No newline at end of file
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