Skip to content

新增3个插件 #130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@
<version>1.8</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
<scope>test</scope>
</dependency>

</dependencies>

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++profiles++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.itfsw.mybatis.generator.plugins;

import com.itfsw.mybatis.generator.plugins.utils.BasePlugin;
import org.mybatis.generator.api.GeneratedXmlFile;
import org.mybatis.generator.api.IntrospectedTable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
* 重写 mapper.xml 插件
*
* @author durenhao
* @date 2020/5/30 22:03
**/
public class OverwrittenMapperXmlPlugin extends BasePlugin {

private static final Logger log = LoggerFactory.getLogger(OverwrittenMapperXmlPlugin.class);

/**
* 测试提交
*
* @param sqlMap
* @param introspectedTable
* @return
*/
@Override
public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {
String dir = sqlMap.getTargetPackage();
if (dir.indexOf('.') != -1) {
dir = dir.replace(".", File.separator);
}

String fileName = sqlMap.getTargetProject() + File.separator + dir + File.separator + sqlMap.getFileName();
File file = new File(fileName);

if (file.exists()) {
if (!file.delete()) {
log.warn("覆盖原有xml文件: {} 失败!", fileName);
}
log.warn("Existing file {} was overwritten ", file);
}

super.sqlMapGenerated(sqlMap, introspectedTable);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@

package com.itfsw.mybatis.generator.plugins;

import com.itfsw.mybatis.generator.plugins.utils.*;
import com.itfsw.mybatis.generator.plugins.utils.hook.ISelectOneByExamplePluginHook;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;

/**
* for update 插件
*/
public class SelectByExampleWithLimitPlugin extends BasePlugin {
public static final String METHOD_SELECT_LIMIT_BY_EXAMPLE = "selectByExampleWithLimit"; // 方法名
public static final String METHOD_SELECT_LIMIT_BY_EXAMPLE_WITH_BLOBS = "selectByExampleWithBLOBsWithLimit"; // 方法名
private XmlElement selectOneByExampleWithLimitEle;
private XmlElement selectOneByExampleWithBLOBsWithLimitEle;

@Override
public void initialized(IntrospectedTable introspectedTable) {
super.initialized(introspectedTable);
// bug:26,27
this.selectOneByExampleWithBLOBsWithLimitEle = null;
this.selectOneByExampleWithLimitEle = null;
}


/**
* Java Client Methods 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param method
* @param interfaze
* @param introspectedTable
* @return
*/
@Override
public boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
FullyQualifiedJavaType baseRecordType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
FullyQualifiedJavaType listType = new FullyQualifiedJavaType("java.util.List");
listType.addTypeArgument(baseRecordType);
FullyQualifiedJavaType integer = new FullyQualifiedJavaType("java.lang.Integer");

Method selectMethod = JavaElementGeneratorTools.generateMethod(
METHOD_SELECT_LIMIT_BY_EXAMPLE_WITH_BLOBS,
JavaVisibility.DEFAULT,
listType,
new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example", "@Param(\"example\")"),
new Parameter(integer, "limit", "@Param(\"limit\")")
);
commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable);

// hook
if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) {
// interface 增加方法
FormatTools.addMethodWithBestPosition(interfaze, selectMethod);
}
return super.clientSelectByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable);
}

/**
* Java Client Methods 生成
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param method
* @param interfaze
* @param introspectedTable
* @return
*/
@Override
public boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {

FullyQualifiedJavaType baseRecordType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
FullyQualifiedJavaType listType = new FullyQualifiedJavaType("java.util.List");
FullyQualifiedJavaType integer = new FullyQualifiedJavaType("java.lang.Integer");

listType.addTypeArgument(baseRecordType);


Method selectMethod = JavaElementGeneratorTools.generateMethod(
METHOD_SELECT_LIMIT_BY_EXAMPLE,
JavaVisibility.DEFAULT,
listType,
new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example", "@Param(\"example\")"),
new Parameter(integer, "limit", "@Param(\"limit\")")
);
commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable);

// hook
if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithoutBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) {
// interface 增加方法
FormatTools.addMethodWithBestPosition(interfaze, selectMethod);
}
return super.clientSelectByExampleWithoutBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable);
}

/**
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param element
* @param introspectedTable
* @return
*/
@Override
public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
// ------------------------------------ selectOneByExample ----------------------------------
// 生成查询语句
XmlElement selectOneElement = new XmlElement("select");
// 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated)
commentGenerator.addComment(selectOneElement);

// 添加ID
selectOneElement.addAttribute(new Attribute("id", METHOD_SELECT_LIMIT_BY_EXAMPLE));
// 添加返回类型
selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId()));
// 添加参数类型
selectOneElement.addAttribute(new Attribute("parameterType","map"));
selectOneElement.addElement(new TextElement("select"));

XmlElement ifDistinctElement = new XmlElement("if");
ifDistinctElement.addAttribute(new Attribute("test", "example.distinct"));
ifDistinctElement.addElement(new TextElement("distinct"));
selectOneElement.addElement(ifDistinctElement);

StringBuilder sb = new StringBuilder();
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,");
selectOneElement.addElement(new TextElement(sb.toString()));
}
selectOneElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable));

sb.setLength(0);
sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneElement.addElement(new TextElement(sb.toString()));
selectOneElement.addElement(XmlElementGeneratorTools.getUpdateByExampleIncludeElement(introspectedTable));

XmlElement ifElement = new XmlElement("if");
ifElement.addAttribute(new Attribute("test", "example.orderByClause != null")); //$NON-NLS-2$
ifElement.addElement(new TextElement("order by ${example.orderByClause}"));
selectOneElement.addElement(ifElement);

XmlElement ifLimitElement = new XmlElement("if");
ifLimitElement.addAttribute(new Attribute("test", "limit != null")); //$NON-NLS-2$
ifLimitElement.addElement(new TextElement("limit #{limit}"));
selectOneElement.addElement(ifLimitElement);

this.selectOneByExampleWithLimitEle = selectOneElement;
return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
}

/**
* 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
*
* @param element
* @param introspectedTable
* @return
*/
@Override
public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
// 生成查询语句
XmlElement selectOneWithBLOBsElement = new XmlElement("select");
// 添加注释(!!!必须添加注释,overwrite覆盖生成时,@see XmlFileMergerJaxp.isGeneratedNode会去判断注释中是否存在OLD_ELEMENT_TAGS中的一点,例子:@mbg.generated)
commentGenerator.addComment(selectOneWithBLOBsElement);

// 添加ID
selectOneWithBLOBsElement.addAttribute(new Attribute("id", METHOD_SELECT_LIMIT_BY_EXAMPLE_WITH_BLOBS));
// 添加返回类型
selectOneWithBLOBsElement.addAttribute(new Attribute("resultMap", introspectedTable.getResultMapWithBLOBsId()));
// 添加参数类型
selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType()));
// 添加查询SQL
selectOneWithBLOBsElement.addElement(new TextElement("select"));

XmlElement ifDistinctElement = new XmlElement("if");
ifDistinctElement.addAttribute(new Attribute("test", "example.distinct"));
ifDistinctElement.addElement(new TextElement("distinct"));
selectOneWithBLOBsElement.addElement(ifDistinctElement);

StringBuilder sb = new StringBuilder();
if (stringHasValue(introspectedTable.getSelectByExampleQueryId())) {
sb.append('\'');
sb.append(introspectedTable.getSelectByExampleQueryId());
sb.append("' as QUERYID,");
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
}

selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBaseColumnListElement(introspectedTable));
selectOneWithBLOBsElement.addElement(new TextElement(","));
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getBlobColumnListElement(introspectedTable));

sb.setLength(0);
sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
selectOneWithBLOBsElement.addElement(new TextElement(sb.toString()));
selectOneWithBLOBsElement.addElement(XmlElementGeneratorTools.getUpdateByExampleIncludeElement(introspectedTable));

XmlElement ifElement1 = new XmlElement("if");
ifElement1.addAttribute(new Attribute("test", "example.orderByClause != null")); //$NON-NLS-2$
ifElement1.addElement(new TextElement("order by ${example.orderByClause}"));
selectOneWithBLOBsElement.addElement(ifElement1);

XmlElement ifLimitElement = new XmlElement("if");
ifLimitElement.addAttribute(new Attribute("test", "limit != null")); //$NON-NLS-2$
ifLimitElement.addElement(new TextElement("limit #{limit}"));
selectOneWithBLOBsElement.addElement(ifLimitElement);


this.selectOneByExampleWithBLOBsWithLimitEle = selectOneWithBLOBsElement;
return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable);
}

@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
if (selectOneByExampleWithLimitEle != null) {
// hook
if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(document, selectOneByExampleWithLimitEle, introspectedTable)) {
// 添加到根节点
FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithLimitEle);
}
}

if (selectOneByExampleWithBLOBsWithLimitEle != null) {
// hook
if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithBLOBsElementGenerated(document, selectOneByExampleWithBLOBsWithLimitEle, introspectedTable)) {
// 添加到根节点
FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsWithLimitEle);
}
}

return true;
}

}
Loading