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,7 +170,6 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -171,7 +170,6 @@ 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);
...@@ -226,7 +224,6 @@ public class ModelBuilderPlugin extends BasePlugin { ...@@ -226,7 +224,6 @@ public class ModelBuilderPlugin extends BasePlugin {
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