ModelBuilderPlugin 增加静态builder方法
This commit is contained in:
@@ -53,7 +53,7 @@ public class ModelBuilderPlugin extends BasePlugin {
|
||||
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
|
||||
// 判断是否有生成Model的WithBLOBs类
|
||||
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);
|
||||
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<IntrospectedColumn> columns, boolean modelBaseRecord) {
|
||||
private InnerClass generateModelBuilder(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, List<IntrospectedColumn> 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<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">"),
|
||||
"new HashMap<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">()"
|
||||
);
|
||||
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<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">"),
|
||||
"new HashMap<String, " + incTools.getIncEnum().getFullyQualifiedName() + ">()"
|
||||
);
|
||||
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) {
|
||||
|
||||
@@ -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<Method> methods = tbBuilder.getMethods("incF1");
|
||||
List<Method> 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<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和具体执行
|
||||
*/
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
-- ----------------------------
|
||||
|
||||
|
||||
@@ -49,5 +49,6 @@
|
||||
<table tableName="tb_blobs">
|
||||
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
|
||||
</table>
|
||||
<table tableName="tb_keys_blobs"/>
|
||||
</context>
|
||||
</generatorConfiguration>
|
||||
Reference in New Issue
Block a user