Commit 454565f7 authored by hewei's avatar hewei

ExampleEnhancedPlugin:增加基于Column的操作以及对应测试用例

parent 5c1c5438
......@@ -3,13 +3,18 @@ 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.JavaElementGeneratorTools;
import com.itfsw.mybatis.generator.plugins.utils.PluginTools;
import com.itfsw.mybatis.generator.plugins.utils.enhanced.InnerInterface;
import com.itfsw.mybatis.generator.plugins.utils.enhanced.InnerInterfaceWrapperToInnerClass;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import java.util.List;
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
/**
* ---------------------------------------------------------------------------
* Example 增强插件
......@@ -19,6 +24,17 @@ import java.util.List;
* ---------------------------------------------------------------------------
*/
public class ExampleEnhancedPlugin extends BasePlugin {
private boolean enableColumnOperate = false; // 是否启用column的操作
/**
* {@inheritDoc}
* @param introspectedTable
*/
@Override
public void initialized(IntrospectedTable introspectedTable) {
super.initialized(introspectedTable);
this.enableColumnOperate = PluginTools.checkDependencyPlugin(context, ModelColumnPlugin.class);
}
/**
* ModelExample Methods 生成
......@@ -36,6 +52,10 @@ public class ExampleEnhancedPlugin extends BasePlugin {
addFactoryMethodToCriteria(topLevelClass, innerClass, introspectedTable);
// andIf
addAndIfMethodToCriteria(topLevelClass, innerClass, introspectedTable);
// column 方法
if (this.enableColumnOperate) {
addColumnMethodToCriteria(topLevelClass, innerClass, introspectedTable);
}
}
}
......@@ -53,6 +73,88 @@ public class ExampleEnhancedPlugin extends BasePlugin {
return true;
}
/**
* 添加列操作方法
* @param topLevelClass
* @param innerClass
* @param introspectedTable
*/
private void addColumnMethodToCriteria(TopLevelClass topLevelClass, InnerClass innerClass, IntrospectedTable introspectedTable) {
for (IntrospectedColumn introspectedColumn : introspectedTable.getNonBLOBColumns()) {
topLevelClass.addImportedType(introspectedColumn.getFullyQualifiedJavaType());
// !!!!! Column import比较特殊引入的是外部类
topLevelClass.addImportedType(introspectedTable.getRules().calculateAllFieldsClass());
// EqualTo
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "EqualTo", "="));
// NotEqualTo
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "NotEqualTo", "<>"));
// GreaterThan
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "GreaterThan", ">"));
// GreaterThanOrEqualTo
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "GreaterThanOrEqualTo", ">="));
// LessThan
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "LessThan", "<"));
// LessThanOrEqualTo
FormatTools.addMethodWithBestPosition(innerClass, this.generateSingleValueMethod(introspectedTable, introspectedColumn, "LessThanOrEqualTo", "<="));
}
}
/**
* 生成column操作的具体方法
* @param introspectedTable
* @param introspectedColumn
* @param nameFragment
* @param operator
* @return
*/
private Method generateSingleValueMethod(IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, String nameFragment, String operator) {
// 方法名
StringBuilder sb = new StringBuilder();
sb.append(introspectedColumn.getJavaProperty());
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
sb.insert(0, "and");
sb.append(nameFragment);
sb.append("Column");
Method method = JavaElementGeneratorTools.generateMethod(
sb.toString(),
JavaVisibility.PUBLIC,
FullyQualifiedJavaType.getCriteriaInstance(),
new Parameter(
new FullyQualifiedJavaType(introspectedTable.getRules().calculateAllFieldsClass().getShortName() + "." + ModelColumnPlugin.ENUM_NAME),
"column"
)
);
commentGenerator.addGeneralMethodComment(method, introspectedTable);
// 方法体
sb.setLength(0);
if (stringHasValue(introspectedColumn.getTypeHandler())) {
sb.append("add");
sb.append(introspectedColumn.getJavaProperty());
sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
sb.append("Criterion(");
} else {
sb.append("addCriterion(");
}
sb.append("new StringBuilder(\"");
sb.append(MyBatis3FormattingUtilities.getAliasedActualColumnName(introspectedColumn));
sb.append(" ");
sb.append(operator);
sb.append(" \").append(");
sb.append("column.");
sb.append(ModelColumnPlugin.METHOD_GET_ESCAPED_COLUMN_NAME);
sb.append("()).toString());");
JavaElementGeneratorTools.generateMethodBody(
method,
sb.toString(),
"return (Criteria) this;"
);
return method;
}
/**
* 添加工厂方法
* @param topLevelClass
......
......@@ -245,11 +245,7 @@ public class ModelColumnPlugin extends BasePlugin {
JavaElementGeneratorTools.generateMethodBody(
mGetEscapedColumnName,
"if (this.isColumnNameDelimited) {",
"StringBuilder sb = new StringBuilder();",
"sb.append(" + CONST_BEGINNING_DELIMITER + ");",
"sb.append(this.column);",
"sb.append(" + CONST_ENDING_DELIMITER + ");",
"return sb.toString();",
"return new StringBuilder().append(" + CONST_BEGINNING_DELIMITER + ").append(this.column).append(" + CONST_ENDING_DELIMITER + ").toString();",
"} else {",
"return this.column;",
"}"
......
......@@ -23,11 +23,9 @@ import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.*;
import java.sql.SQLException;
import java.util.List;
/**
* ---------------------------------------------------------------------------
......@@ -42,7 +40,7 @@ public class ExampleEnhancedPluginTest {
* 初始化数据库
*/
@BeforeClass
public static void init() throws SQLException, IOException, ClassNotFoundException {
public static void init() throws SQLException, IOException {
DBHelper.createDB("scripts/ExampleEnhancedPlugin/init.sql");
}
......@@ -62,7 +60,7 @@ public class ExampleEnhancedPluginTest {
// 调用example方法能正常返回
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExampleCriteria.invoke("example"));
Assert.assertEquals(sql, "select id, field1 from tb");
Assert.assertEquals(sql, "select id, field1, field2 from tb");
}
});
}
......@@ -85,7 +83,7 @@ public class ExampleEnhancedPluginTest {
tbExample.invoke("orderBy", order); // 可变参数方法直接设置order by
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1 from tb order by id desc , field1 asc");
Assert.assertEquals(sql, "select id, field1, field2 from tb order by id desc , field1 asc");
}
});
}
......@@ -98,37 +96,109 @@ public class ExampleEnhancedPluginTest {
MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/ExampleEnhancedPlugin/mybatis-generator.xml");
tool.generate(new AbstractShellCallback() {
@Override
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) {
try {
ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));
// 1. andIf true
ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
ObjectUtil tbExampleCriteria = new ObjectUtil(tbExample.invoke("createCriteria"));
// 代理实现接口
Object criteriaAdd = Proxy.newProxyInstance(loader, new Class[]{
loader.loadClass(packagz + ".TbExample$Criteria$ICriteriaAdd")
}, new TestInvocationHandler());
Method method = tbExampleCriteria.getMethods("andIf").get(0);
method.invoke(tbExampleCriteria.getObject(), true, criteriaAdd);
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1 from tb WHERE ( id = '5' )");
// 2. andIf false
ObjectUtil tbExample1 = new ObjectUtil(loader, packagz + ".TbExample");
ObjectUtil tbExampleCriteria1 = new ObjectUtil(tbExample1.invoke("createCriteria"));
method = tbExampleCriteria1.getMethods("andIf").get(0);
method.invoke(tbExampleCriteria1.getObject(), false, criteriaAdd);
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample1.getObject());
Assert.assertEquals(sql, "select id, field1 from tb");
} catch (Exception e) {
e.printStackTrace();
Assert.assertTrue(false);
}
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));
// 1. andIf true
ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
ObjectUtil tbExampleCriteria = new ObjectUtil(tbExample.invoke("createCriteria"));
// 代理实现接口
Object criteriaAdd = Proxy.newProxyInstance(loader, new Class[]{
loader.loadClass(packagz + ".TbExample$Criteria$ICriteriaAdd")
}, new TestInvocationHandler());
Method method = tbExampleCriteria.getMethods("andIf").get(0);
method.invoke(tbExampleCriteria.getObject(), true, criteriaAdd);
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '5' )");
// 2. andIf false
ObjectUtil tbExample1 = new ObjectUtil(loader, packagz + ".TbExample");
ObjectUtil tbExampleCriteria1 = new ObjectUtil(tbExample1.invoke("createCriteria"));
method = tbExampleCriteria1.getMethods("andIf").get(0);
method.invoke(tbExampleCriteria1.getObject(), false, criteriaAdd);
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample1.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb");
}
});
}
/**
* 测试配置ModelColumnPlugin插件
*/
@Test
public void testWithModelColumnPlugin() throws Exception {
MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/ExampleEnhancedPlugin/mybatis-generator-with-ModelColumnPlugin.xml");
tool.generate(new AbstractShellCallback() {
@Override
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));
ObjectUtil columnField2 = new ObjectUtil(loader, packagz + ".Tb$Column#field2");
// 1. EqualTo
ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
ObjectUtil criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdEqualToColumn", columnField2.getObject());
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = field2 )");
List list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 1);
// 2. NotEqualTo
tbExample = new ObjectUtil(loader, packagz + ".TbExample");
criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdNotEqualToColumn", columnField2.getObject());
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id <> field2 )");
list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 9);
// 3. GreaterThan
tbExample = new ObjectUtil(loader, packagz + ".TbExample");
criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdGreaterThanColumn", columnField2.getObject());
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id > field2 )");
list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 4);
// 4. GreaterThanOrEqualTo
tbExample = new ObjectUtil(loader, packagz + ".TbExample");
criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdGreaterThanOrEqualToColumn", columnField2.getObject());
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id >= field2 )");
list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 5);
// 5. LessThan
tbExample = new ObjectUtil(loader, packagz + ".TbExample");
criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdLessThanColumn", columnField2.getObject());
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id < field2 )");
list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 5);
// 6. LessThanOrEqualTo
tbExample = new ObjectUtil(loader, packagz + ".TbExample");
criteria = new ObjectUtil(tbExample.invoke("createCriteria"));
criteria.invoke("andIdLessThanOrEqualToColumn", columnField2.getObject());
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExample", tbExample.getObject());
Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id <= field2 )");
list = (List) tbMapper.invoke("selectByExample", tbExample.getObject());
Assert.assertEquals(list.size(), 6);
}
});
}
......
......@@ -22,19 +22,20 @@ DROP TABLE IF EXISTS `tb`;
CREATE TABLE `tb` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1',
`field1` varchar(255) DEFAULT NULL COMMENT '注释2',
`field2` bigint(20) NOT NULL COMMENT '注释3',
PRIMARY KEY (`id`)
);
-- ----------------------------
-- Records of tb
-- ----------------------------
INSERT INTO `tb` VALUES ('1', 'f1');
INSERT INTO `tb` VALUES ('2', 'f2');
INSERT INTO `tb` VALUES ('3', 'f3');
INSERT INTO `tb` VALUES ('4', 'f4');
INSERT INTO `tb` VALUES ('5', 'f5');
INSERT INTO `tb` VALUES ('6', 'f6');
INSERT INTO `tb` VALUES ('7', 'f7');
INSERT INTO `tb` VALUES ('8', 'f8');
INSERT INTO `tb` VALUES ('9', 'f9');
INSERT INTO `tb` VALUES ('10', 'f10');
\ No newline at end of file
INSERT INTO `tb` VALUES ('1', 'f1', '1');
INSERT INTO `tb` VALUES ('2', 'f2', '1');
INSERT INTO `tb` VALUES ('3', 'f3', '1');
INSERT INTO `tb` VALUES ('4', 'f4', '1');
INSERT INTO `tb` VALUES ('5', 'f5', '1');
INSERT INTO `tb` VALUES ('6', 'f6', '100');
INSERT INTO `tb` VALUES ('7', 'f7', '100');
INSERT INTO `tb` VALUES ('8', 'f8', '100');
INSERT INTO `tb` VALUES ('9', 'f9', '100');
INSERT INTO `tb` VALUES ('10', 'f10', '100');
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ 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.
-->
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="db.properties"/>
<!--导入属性配置 -->
<context id="default" targetRuntime="MyBatis3">
<!-- 插件 -->
<plugin type="com.itfsw.mybatis.generator.plugins.ExampleEnhancedPlugin"/>
<plugin type="com.itfsw.mybatis.generator.plugins.ModelColumnPlugin"/>
<!--jdbc的数据库连接 -->
<jdbcConnection driverClass="${driver}" connectionURL="${url}" userId="${username}" password="${password}" />
<!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
targetPackage 指定生成的model生成所在的包名
targetProject 指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage="" targetProject="">
<!-- 是否对model添加 构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 给Model添加一个父类 -->
<!--<property name="rootClass" value="com.itfsw.base"/>-->
</javaModelGenerator>
<!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
<sqlMapGenerator targetPackage="" targetProject="" />
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator targetPackage="" targetProject="" type="XMLMAPPER"/>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 要自动生成的表 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<table tableName="tb">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</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