From 00e575c4cec3b9d519debf53bd18f927cd15202d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E4=BB=81=E6=B5=A9?= Date: Wed, 14 Apr 2021 23:58:32 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=B8=8E=E5=8D=95=E5=85=83=E6=B5=8B=E7=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 + .../plugins/OverwrittenMapperXmlPlugin.java | 48 ++++ .../SelectByExampleForUpdatePlugin.java | 235 +++++++++++++++++ .../SelectByExampleWithLimitPlugin.java | 241 ++++++++++++++++++ .../SelectOneByExampleForUpdatePlugin.java | 216 ++++++++++++++++ .../OverwrittenMapperXmlPluginTest.java | 66 +++++ .../SelectByExampleForUpdatePluginTest.java | 74 ++++++ .../plugins/tools/MyBatisGeneratorTool.java | 48 +++- src/test/resources/db.properties | 4 +- .../OverwrittenMapperXmlPlugin/init.sql | 27 ++ .../mybatis-generator.xml | 57 +++++ .../SelectByExampleForUpdatePlugin/init.sql | 70 +++++ .../mybatis-generator.xml | 54 ++++ 13 files changed, 1140 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPlugin.java create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleWithLimitPlugin.java create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java create mode 100644 src/test/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPluginTest.java create mode 100644 src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java create mode 100644 src/test/resources/scripts/OverwrittenMapperXmlPlugin/init.sql create mode 100644 src/test/resources/scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml create mode 100644 src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql create mode 100644 src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml diff --git a/pom.xml b/pom.xml index a237a152..10e47144 100644 --- a/pom.xml +++ b/pom.xml @@ -115,6 +115,14 @@ 1.8 test + + + commons-codec + commons-codec + 1.15 + test + + diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPlugin.java new file mode 100644 index 00000000..52ee195b --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPlugin.java @@ -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; + } +} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java new file mode 100644 index 00000000..fe2490d1 --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java @@ -0,0 +1,235 @@ + +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 SelectByExampleForUpdatePlugin extends BasePlugin { + public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectByExampleForUpdate"; // 方法名 + public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectByExampleWithBLOBsForUpdate"; // 方法名 + private XmlElement selectOneByExampleEle; + private XmlElement selectOneByExampleWithBLOBsEle; + + @Override + public void initialized(IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); + // bug:26,27 + this.selectOneByExampleWithBLOBsEle = null; + this.selectOneByExampleEle = 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); + + Method selectMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS, + JavaVisibility.DEFAULT, + listType, + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); + + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) { + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectByExampleWithBLOBsForUpdate方法。"); + } + 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"); + listType.addTypeArgument(baseRecordType); + + Method selectMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE, + JavaVisibility.DEFAULT, + listType, + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); + + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithoutBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) { + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleForUpdate方法。"); + } + 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_ONE_BY_EXAMPLE)); + // 添加返回类型 + selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId())); + // 添加参数类型 + selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); + selectOneElement.addElement(new TextElement("select")); + + XmlElement ifDistinctElement = new XmlElement("if"); + ifDistinctElement.addAttribute(new Attribute("test", "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.getExampleIncludeElement(introspectedTable)); + + XmlElement ifElement = new XmlElement("if"); + ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ + ifElement.addElement(new TextElement("order by ${orderByClause}")); + selectOneElement.addElement(ifElement); + + // 只查询一条 + selectOneElement.addElement(new TextElement("for update")); + + this.selectOneByExampleEle = 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_ONE_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", "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.getExampleIncludeElement(introspectedTable)); + + XmlElement ifElement1 = new XmlElement("if"); + ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ + ifElement1.addElement(new TextElement("order by ${orderByClause}")); + selectOneWithBLOBsElement.addElement(ifElement1); + + // 只查询一条 + selectOneWithBLOBsElement.addElement(new TextElement("for update")); + + + this.selectOneByExampleWithBLOBsEle = selectOneWithBLOBsElement; + return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); + } + + @Override + public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { + if (selectOneByExampleEle != null) { + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(document, selectOneByExampleEle, introspectedTable)) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleForUpdate方法。"); + } + } + + if (selectOneByExampleWithBLOBsEle != null) { + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithBLOBsElementGenerated(document, selectOneByExampleWithBLOBsEle, introspectedTable)) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + } + } + + return true; + } + +} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleWithLimitPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleWithLimitPlugin.java new file mode 100644 index 00000000..a766f17a --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleWithLimitPlugin.java @@ -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; + } + +} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java new file mode 100644 index 00000000..db3243fd --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java @@ -0,0 +1,216 @@ + +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 SelectOneByExampleForUpdatePlugin extends BasePlugin { + public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectOneByExampleForUpdate"; // 方法名 + public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectOneByExampleWithBLOBsForUpdate"; // 方法名 + private XmlElement selectOneByExampleEle; + private XmlElement selectOneByExampleWithBLOBsEle; + + @Override + public void initialized(IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); + // bug:26,27 + this.selectOneByExampleWithBLOBsEle = null; + this.selectOneByExampleEle = 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) { + // 方法生成 selectOneByExample + Method selectOneMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS, + JavaVisibility.DEFAULT, + JavaElementGeneratorTools.getModelTypeWithBLOBs(introspectedTable), + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); + + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithBLOBsMethodGenerated(selectOneMethod, interfaze, introspectedTable)) { + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); + logger.debug("itfsw(ForUpdate):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + } + 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) { + // 方法生成 selectOneByExample + Method selectOneMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE, + JavaVisibility.DEFAULT, + JavaElementGeneratorTools.getModelTypeWithoutBLOBs(introspectedTable), + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); + + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithoutBLOBsMethodGenerated(selectOneMethod, interfaze, introspectedTable)) { + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); + logger.debug("itfsw(ForUpdate):" + interfaze.getType().getShortName() + "增加selectOneByExampleForUpdate方法。"); + } + return super.clientSelectByExampleWithoutBLOBsMethodGenerated(selectOneMethod, 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_ONE_BY_EXAMPLE)); + // 添加返回类型 + selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId())); + // 添加参数类型 + selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); + selectOneElement.addElement(new TextElement("select")); + + 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.getExampleIncludeElement(introspectedTable)); + + XmlElement ifElement = new XmlElement("if"); + ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ + ifElement.addElement(new TextElement("order by ${orderByClause}")); + selectOneElement.addElement(ifElement); + + // 只查询一条 + selectOneElement.addElement(new TextElement("limit 1")); + selectOneElement.addElement(new TextElement(" for update")); + + this.selectOneByExampleEle = 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_ONE_BY_EXAMPLE_WITH_BLOBS)); + // 添加返回类型 + selectOneWithBLOBsElement.addAttribute(new Attribute("resultMap", introspectedTable.getResultMapWithBLOBsId())); + // 添加参数类型 + selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); + // 添加查询SQL + selectOneWithBLOBsElement.addElement(new TextElement("select")); + + 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.getExampleIncludeElement(introspectedTable)); + + XmlElement ifElement1 = new XmlElement("if"); + ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ + ifElement1.addElement(new TextElement("order by ${orderByClause}")); + selectOneWithBLOBsElement.addElement(ifElement1); + + // 只查询一条 + selectOneWithBLOBsElement.addElement(new TextElement("limit 1")); + selectOneWithBLOBsElement.addElement(new TextElement(" for update")); + + + this.selectOneByExampleWithBLOBsEle = selectOneWithBLOBsElement; + return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); + } + + @Override + public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { + if (selectOneByExampleEle != null) { + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(document, selectOneByExampleEle, introspectedTable)) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleEle); + logger.debug("itfsw(ForUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleForUpdate方法。"); + } + } + + if (selectOneByExampleWithBLOBsEle != null) { + // hook + if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithBLOBsElementGenerated(document, selectOneByExampleWithBLOBsEle, introspectedTable)) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsEle); + logger.debug("itfsw(ForUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + } + } + + return true; + } + +} diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPluginTest.java new file mode 100644 index 00000000..e506b44b --- /dev/null +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/OverwrittenMapperXmlPluginTest.java @@ -0,0 +1,66 @@ +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.tools.DBHelper; +import com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool; +import org.apache.commons.codec.digest.DigestUtils; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mybatis.generator.api.MyBatisGenerator; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.attribute.BasicFileAttributes; + +public class OverwrittenMapperXmlPluginTest { + + private static String packageDir; + + @BeforeClass + public static void init() throws Exception { + DBHelper.createDB("scripts/OverwrittenMapperXmlPlugin/init.sql"); + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml"); + MyBatisGenerator generate = tool.generateAndWriteFiles("tmp"); + packageDir = tool.getTargetPackage(); + } + + + @Test + public void test() throws Exception { + String path = this.getClass().getClassLoader().getResource("").getPath(); + + String target = packageDir.replaceAll("\\.", "/"); + String filePath = path + target + "/TbMapper.xml"; + File file = new File(filePath); + + BasicFileAttributes fileAttributes = Files.readAttributes(file.toPath(), + BasicFileAttributes.class); + // 文件创建时间 + long millis = fileAttributes.creationTime().toMillis(); + // 文件MD5 + String md5 = ""; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + md5 = DigestUtils.md5Hex(fileInputStream); + } + // 重新生成文件 + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml"); + MyBatisGenerator generate = tool.generateAndWriteFiles("tmp"); + File newFile = new File(filePath); + + BasicFileAttributes newFileAttributes = Files.readAttributes(file.toPath(), + BasicFileAttributes.class); + // 文件创建时间 + long newMillis = newFileAttributes.creationTime().toMillis(); + // 文件MD5 + String nMd5 = ""; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + nMd5 = DigestUtils.md5Hex(fileInputStream); + } + // 创建时间不同 + Assert.assertTrue(newMillis != millis); + // MD5值相同 + Assert.assertTrue(nMd5.equals(md5) && !"".equals(md5)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java new file mode 100644 index 00000000..46122f93 --- /dev/null +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java @@ -0,0 +1,74 @@ +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.tools.*; +import org.apache.ibatis.session.SqlSession; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +/** + * @author durenhao + * @date 2021/4/14 23:42 + **/ +public class SelectByExampleForUpdatePluginTest { + + + @BeforeClass + public static void init() throws Exception { + DBHelper.createDB("scripts/SelectByExampleForUpdatePlugin/init.sql"); + } + + + @Test + public void testForUpdate() throws Exception { + + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectByExampleForUpdatePlugin/mybatis-generator.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 TbExample = new ObjectUtil(loader, packagz + ".TbExample"); + ObjectUtil criteria = new ObjectUtil(TbExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleForUpdate", TbExample.getObject()); + Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '1' ) for update"); + Object result = tbMapper.invoke("selectByExampleForUpdate", TbExample.getObject()); + + ObjectUtil Tb = new ObjectUtil(((List)result).get(0)); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertNull(Tb.get("field2")); + } + }); + } + + @Test + public void testForUpdateWithBLOBs() throws Exception{ + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml"); + tool.generate(new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + ObjectUtil TbBlobsMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper"))); + + ObjectUtil TbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample"); + ObjectUtil criteria = new ObjectUtil(TbBlobsExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(TbBlobsMapper.getObject(), "selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + Assert.assertEquals(sql, "select id, field1 , field2, field3 from tb_blobs WHERE ( id = '1' ) for update"); + Object result = TbBlobsMapper.invoke("selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + ObjectUtil Tb = new ObjectUtil(((List)result).get(0)); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertEquals(Tb.get("field2"), "fd2"); + } + }); + } + +} diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/tools/MyBatisGeneratorTool.java b/src/test/java/com/itfsw/mybatis/generator/plugins/tools/MyBatisGeneratorTool.java index 144adfe4..f10a4910 100644 --- a/src/test/java/com/itfsw/mybatis/generator/plugins/tools/MyBatisGeneratorTool.java +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/tools/MyBatisGeneratorTool.java @@ -30,6 +30,7 @@ import org.mybatis.generator.exception.InvalidConfigurationException; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; +import org.mybatis.generator.internal.util.StringUtility; import javax.sql.DataSource; import javax.tools.JavaCompiler; @@ -49,8 +50,9 @@ /** * --------------------------------------------------------------------------- - * + *

* --------------------------------------------------------------------------- + * * @author: hewei * @time:2017/7/4 16:14 * --------------------------------------------------------------------------- @@ -64,6 +66,7 @@ public class MyBatisGeneratorTool { /** * 创建 + * * @param resource * @return */ @@ -75,12 +78,13 @@ public static MyBatisGeneratorTool create(String resource) throws IOException, X ConfigurationParser cp = new ConfigurationParser(tool.warnings); tool.config = cp.parseConfiguration(Resources.getResourceAsStream(resource)); // 修正配置目标 - tool.fixConfigToTarget(); + tool.fixConfigToTarget(null); return tool; } /** * 执行MyBatisGenerator + * * @param before * @param callback * @return @@ -98,6 +102,7 @@ public MyBatisGenerator generate(IBeforeCallback before, AbstractShellCallback c /** * 执行MyBatisGenerator + * * @param callback * @return * @throws SQLException @@ -105,13 +110,14 @@ public MyBatisGenerator generate(IBeforeCallback before, AbstractShellCallback c * @throws InterruptedException */ public MyBatisGenerator generate(AbstractShellCallback callback) throws Exception { - return this.generate(() -> { + return this.generate(() -> { - }, callback); + }, callback); } /** * 执行MyBatisGenerator + * * @param before * @return * @throws SQLException @@ -127,6 +133,7 @@ public MyBatisGenerator generate(IBeforeCallback before) throws Exception { /** * 执行MyBatisGenerator(不生成文件) + * * @return * @throws SQLException * @throws IOException @@ -138,8 +145,25 @@ public MyBatisGenerator generate() throws InvalidConfigurationException, Interru return myBatisGenerator; } + /** + * 执行MyBatisGenerator(生成文件) + * + * @return + * @throws InvalidConfigurationException + * @throws InterruptedException + * @throws SQLException + * @throws IOException + */ + public MyBatisGenerator generateAndWriteFiles(String dir) throws InvalidConfigurationException, InterruptedException, SQLException, IOException { + MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, new DefaultShellCallback(true), warnings); + fixConfigToTarget(dir); + myBatisGenerator.generate(null, null, null, true); + return myBatisGenerator; + } + /** * 编译项目并返回 SqlSession + * * @return */ public SqlSession compile() throws IOException, ClassNotFoundException { @@ -152,6 +176,7 @@ public SqlSession compile() throws IOException, ClassNotFoundException { /** * 获取目标目录的ClassLoader + * * @return */ public ClassLoader getTargetClassLoader() throws MalformedURLException { @@ -162,6 +187,7 @@ public ClassLoader getTargetClassLoader() throws MalformedURLException { /** * 获取SqlSession + * * @return * @throws IOException */ @@ -186,6 +212,7 @@ public SqlSession getSqlSession() throws IOException, ClassNotFoundException { /** * 动态编译java文件 + * * @param files */ private void compileJavaFiles(List files) { @@ -206,6 +233,7 @@ private void compileJavaFiles(List files) { /** * 获取指定后缀的文件 + * * @param file * @return */ @@ -227,9 +255,14 @@ private List getGeneratedFiles(File file, String ext) { /** * 修正配置到指定target */ - private void fixConfigToTarget() { + private void fixConfigToTarget(String dir) { this.targetProject = this.getClass().getClassLoader().getResource("").getPath(); - this.targetPackage = DAO_PACKAGE + ".s" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()); + if (StringUtility.stringHasValue(dir)) { + this.targetPackage = DAO_PACKAGE + "." + dir; + } else { + this.targetPackage = DAO_PACKAGE + ".s" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()); + } + for (Context context : config.getContexts()) { context.getJavaModelGeneratorConfiguration().setTargetProject(targetProject); context.getJavaModelGeneratorConfiguration().setTargetPackage(targetPackage); @@ -242,6 +275,7 @@ private void fixConfigToTarget() { /** * Getter method for property warnings. + * * @return property value of warnings * @author hewei */ @@ -251,6 +285,7 @@ public List getWarnings() { /** * Getter method for property config. + * * @return property value of config * @author hewei */ @@ -260,6 +295,7 @@ public Configuration getConfig() { /** * Getter method for property targetPackage. + * * @return property value of targetPackage * @author hewei */ diff --git a/src/test/resources/db.properties b/src/test/resources/db.properties index 9dea2226..edce0393 100644 --- a/src/test/resources/db.properties +++ b/src/test/resources/db.properties @@ -15,6 +15,6 @@ # driver=com.mysql.cj.jdbc.Driver -url=jdbc:mysql://localhost:3306/mybatis-generator-plugin?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true +url=jdbc:mysql://106.12.208.53:3306/mybatis-generator-plugin?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username=root -password=root \ No newline at end of file +password=ak402507979!@# \ No newline at end of file diff --git a/src/test/resources/scripts/OverwrittenMapperXmlPlugin/init.sql b/src/test/resources/scripts/OverwrittenMapperXmlPlugin/init.sql new file mode 100644 index 00000000..e59c6eca --- /dev/null +++ b/src/test/resources/scripts/OverwrittenMapperXmlPlugin/init.sql @@ -0,0 +1,27 @@ +/* +Navicat MySQL Data Transfer + +Source Server : localhost +Source Server Version : 50617 +Source Host : localhost:3306 +Source Database : mybatis-generator-plugin + +Target Server Type : MYSQL +Target Server Version : 50617 +File Encoding : 65001 + +Date: 2017-06-26 17:30:13 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for tb +-- ---------------------------- +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`) +); \ No newline at end of file diff --git a/src/test/resources/scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml b/src/test/resources/scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml new file mode 100644 index 00000000..62c771e7 --- /dev/null +++ b/src/test/resources/scripts/OverwrittenMapperXmlPlugin/mybatis-generator.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql b/src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql new file mode 100644 index 00000000..1f0955c4 --- /dev/null +++ b/src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql @@ -0,0 +1,70 @@ +/* +Navicat MySQL Data Transfer + +Source Server : localhost +Source Server Version : 50617 +Source Host : localhost:3306 +Source Database : mybatis-generator-plugin + +Target Server Type : MYSQL +Target Server Version : 50617 +File Encoding : 65001 + +Date: 2017-07-03 17:34:11 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for tb +-- ---------------------------- +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` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb +-- ---------------------------- +INSERT INTO `tb` VALUES ('1', 'fd1', null); +INSERT INTO `tb` VALUES ('2', null, '2'); +INSERT INTO `tb` VALUES ('3', 'fd3', '3'); + +-- ---------------------------- +-- Table structure for tb_blobs +-- ---------------------------- +DROP TABLE IF EXISTS `tb_blobs`; +CREATE TABLE `tb_blobs` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `field1` varchar(255) DEFAULT NULL, + `field2` longtext COMMENT '注释2', + `field3` longtext, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb_blobs +-- ---------------------------- +INSERT INTO `tb_blobs` VALUES ('1', 'fd1', 'fd2', null); + +-- ---------------------------- +-- Table structure for tb_keys +-- ---------------------------- +DROP TABLE IF EXISTS `tb_keys`; +CREATE TABLE `tb_keys` ( + `key1` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `key2` varchar(255) NOT NULL, + `field1` varchar(255) DEFAULT NULL COMMENT '注释2', + `field2` int(11) DEFAULT NULL, + PRIMARY KEY (`key1`,`key2`) +) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb_keys +-- ---------------------------- +INSERT INTO `tb_keys` VALUES ('1', '2', 'fd1', null); +INSERT INTO `tb_keys` VALUES ('2', '3', null, '2'); +INSERT INTO `tb_keys` VALUES ('3', '4', 'fd2', '3'); diff --git a/src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml b/src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml new file mode 100644 index 00000000..94623a8e --- /dev/null +++ b/src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+
+
\ No newline at end of file From e4437020a2cf8d90c76af28d893b3922cb36ac4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E4=BB=81=E6=B5=A9?= Date: Fri, 16 Apr 2021 22:49:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=B8=8E=E5=8D=95=E5=85=83=E6=B5=8B=E7=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SelectByExampleForUpdatePlugin.java | 235 ---------------- .../plugins/SelectForUpdatePlugin.java | 261 ++++++++++++++++++ .../SelectOneByExampleForUpdatePlugin.java | 216 --------------- .../generator/plugins/SerializablePlugin.java | 71 +++++ .../SelectByExampleForUpdatePluginTest.java | 74 ----- .../SelectForUpdatePluginPluginTest.java | 149 ++++++++++ .../plugins/SerializablePluginTest.java | 77 ++++++ .../init.sql | 0 .../mybatis-generator.xml | 54 ++++ .../scripts/SerializablePlugin/init.sql | 70 +++++ .../mybatis-generator.xml | 2 +- 11 files changed, 683 insertions(+), 526 deletions(-) delete mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java delete mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java create mode 100644 src/main/java/com/itfsw/mybatis/generator/plugins/SerializablePlugin.java delete mode 100644 src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java create mode 100644 src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java create mode 100644 src/test/java/com/itfsw/mybatis/generator/plugins/SerializablePluginTest.java rename src/test/resources/scripts/{SelectByExampleForUpdatePlugin => SelectForUpdatePlugin}/init.sql (100%) create mode 100644 src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml create mode 100644 src/test/resources/scripts/SerializablePlugin/init.sql rename src/test/resources/scripts/{SelectByExampleForUpdatePlugin => SerializablePlugin}/mybatis-generator.xml (96%) diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java deleted file mode 100644 index fe2490d1..00000000 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePlugin.java +++ /dev/null @@ -1,235 +0,0 @@ - -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 SelectByExampleForUpdatePlugin extends BasePlugin { - public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectByExampleForUpdate"; // 方法名 - public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectByExampleWithBLOBsForUpdate"; // 方法名 - private XmlElement selectOneByExampleEle; - private XmlElement selectOneByExampleWithBLOBsEle; - - @Override - public void initialized(IntrospectedTable introspectedTable) { - super.initialized(introspectedTable); - // bug:26,27 - this.selectOneByExampleWithBLOBsEle = null; - this.selectOneByExampleEle = 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); - - Method selectMethod = JavaElementGeneratorTools.generateMethod( - METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS, - JavaVisibility.DEFAULT, - listType, - new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") - ); - commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); - - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) { - // interface 增加方法 - FormatTools.addMethodWithBestPosition(interfaze, selectMethod); - logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectByExampleWithBLOBsForUpdate方法。"); - } - 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"); - listType.addTypeArgument(baseRecordType); - - Method selectMethod = JavaElementGeneratorTools.generateMethod( - METHOD_SELECT_ONE_BY_EXAMPLE, - JavaVisibility.DEFAULT, - listType, - new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") - ); - commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); - - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithoutBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable)) { - // interface 增加方法 - FormatTools.addMethodWithBestPosition(interfaze, selectMethod); - logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleForUpdate方法。"); - } - 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_ONE_BY_EXAMPLE)); - // 添加返回类型 - selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId())); - // 添加参数类型 - selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); - selectOneElement.addElement(new TextElement("select")); - - XmlElement ifDistinctElement = new XmlElement("if"); - ifDistinctElement.addAttribute(new Attribute("test", "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.getExampleIncludeElement(introspectedTable)); - - XmlElement ifElement = new XmlElement("if"); - ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ - ifElement.addElement(new TextElement("order by ${orderByClause}")); - selectOneElement.addElement(ifElement); - - // 只查询一条 - selectOneElement.addElement(new TextElement("for update")); - - this.selectOneByExampleEle = 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_ONE_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", "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.getExampleIncludeElement(introspectedTable)); - - XmlElement ifElement1 = new XmlElement("if"); - ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ - ifElement1.addElement(new TextElement("order by ${orderByClause}")); - selectOneWithBLOBsElement.addElement(ifElement1); - - // 只查询一条 - selectOneWithBLOBsElement.addElement(new TextElement("for update")); - - - this.selectOneByExampleWithBLOBsEle = selectOneWithBLOBsElement; - return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); - } - - @Override - public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { - if (selectOneByExampleEle != null) { - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(document, selectOneByExampleEle, introspectedTable)) { - // 添加到根节点 - FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleEle); - logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleForUpdate方法。"); - } - } - - if (selectOneByExampleWithBLOBsEle != null) { - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithBLOBsElementGenerated(document, selectOneByExampleWithBLOBsEle, introspectedTable)) { - // 添加到根节点 - FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsEle); - logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); - } - } - - return true; - } - -} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java new file mode 100644 index 00000000..add9794c --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java @@ -0,0 +1,261 @@ +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.XmlElementTools; +import com.itfsw.mybatis.generator.plugins.utils.hook.ISelectOneByExamplePluginHook; +import org.mybatis.generator.api.IntrospectedColumn; +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 java.util.List; + +/** + * 悲观锁插件 + * + * @author durenhao + * @date 2021/4/15 21:33 + **/ +public class SelectForUpdatePlugin extends BasePlugin implements ISelectOneByExamplePluginHook { + + public static final String METHOD_SELECT_PRIMARY_KEY_FOR_UPDATE = "selectByPrimaryKeyForUpdate"; // 方法名 + + public static final String METHOD_SELECT_BY_EXAMPLE_FOR_UPDATE = "selectByExampleForUpdate"; // 方法名 + + public static final String METHOD_SELECT_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE = "selectByExampleWithBLOBsForUpdate"; // 方法名 + + public static final String METHOD_SELECT_ONE_BY_EXAMPLE_FOR_UPDATE = "selectOneByExampleForUpdate"; // 方法名 + + public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE = "selectOneByExampleWithBLOBsForUpdate"; // 方法名 + + private XmlElement selectByPrimaryKeyForUpdateEle; + + private XmlElement selectByExampleForUpdateEle; + + private XmlElement selectByExampleWithBLOBsForUpdateEle; + + private XmlElement selectOneByExampleForUpdateEle; + + private XmlElement selectOneByExampleWithBLOBsForUpdateEle; + + + @Override + public void initialized(IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); + this.selectByPrimaryKeyForUpdateEle = null; + + this.selectByExampleForUpdateEle = null; + this.selectByExampleWithBLOBsForUpdateEle = null; + + this.selectOneByExampleForUpdateEle = null; + this.selectOneByExampleWithBLOBsForUpdateEle = null; + } + + + @Override + public boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + + FullyQualifiedJavaType baseRecordType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()); + FullyQualifiedJavaType listType = new FullyQualifiedJavaType("java.util.List"); + listType.addTypeArgument(baseRecordType); + + Method selectMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_BY_EXAMPLE_FOR_UPDATE, + JavaVisibility.DEFAULT, + listType, + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); + + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectByExampleForUpdate方法。"); + return super.clientSelectByExampleWithoutBLOBsMethodGenerated(selectMethod, interfaze, introspectedTable); + + } + + @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); + + Method selectMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE, + JavaVisibility.DEFAULT, + listType, + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); + + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectByExampleWithBLOBsForUpdate方法。"); + return super.clientSelectByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable); + + } + + @Override + public boolean clientSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + List primaryKeyColumns = introspectedTable.getPrimaryKeyColumns(); + if (primaryKeyColumns.size() != 1) { + logger.warn("itfsw(forUpdate插件):" + "主键个数不为1,无法增加selectByPrimaryKeyForUpdate方法。"); + return true; + } + FullyQualifiedJavaType fullyQualifiedJavaType = primaryKeyColumns.get(0).getFullyQualifiedJavaType(); + Method selectMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_PRIMARY_KEY_FOR_UPDATE, + JavaVisibility.DEFAULT, + JavaElementGeneratorTools.getModelTypeWithBLOBs(introspectedTable), + new Parameter(fullyQualifiedJavaType, "id") + ); + + commentGenerator.addGeneralMethodComment(selectMethod, introspectedTable); + + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectByPrimaryKeyForUpdate方法。"); + return super.clientSelectByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable); + + } + + + @Override + public boolean clientSelectOneByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + Method selectOneMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE, + JavaVisibility.DEFAULT, + JavaElementGeneratorTools.getModelTypeWithBLOBs(introspectedTable), + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); + + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + return super.clientSelectByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable); + } + + @Override + public boolean clientSelectOneByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 方法生成 selectOneByExample + Method selectOneMethod = JavaElementGeneratorTools.generateMethod( + METHOD_SELECT_ONE_BY_EXAMPLE_FOR_UPDATE, + JavaVisibility.DEFAULT, + JavaElementGeneratorTools.getModelTypeWithoutBLOBs(introspectedTable), + new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") + ); + commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); + + // interface 增加方法 + FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); + logger.debug("itfsw(forUpdate插件):" + interfaze.getType().getShortName() + "增加selectOneByExampleForUpdate方法。"); + return super.clientSelectByExampleWithoutBLOBsMethodGenerated(selectOneMethod, interfaze, introspectedTable); + } + + + @Override + public boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); + xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_PRIMARY_KEY_FOR_UPDATE)); + commentGenerator.addComment(xmlElement); + this.selectByPrimaryKeyForUpdateEle = xmlElement; + return super.sqlMapSelectByPrimaryKeyElementGenerated(element, introspectedTable); + } + + /** + * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html + * + * @param element + * @param introspectedTable + * @return + */ + @Override + public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); + xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_BY_EXAMPLE_FOR_UPDATE)); + commentGenerator.addComment(xmlElement); + this.selectByExampleForUpdateEle = xmlElement; + return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable); + } + + @Override + public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); + xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE)); + commentGenerator.addComment(xmlElement); + this.selectByExampleWithBLOBsForUpdateEle = xmlElement; + return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); + } + + + @Override + public boolean sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(Document document, XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); + xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_ONE_BY_EXAMPLE_FOR_UPDATE)); + commentGenerator.addComment(xmlElement); + this.selectOneByExampleForUpdateEle = xmlElement; + return true; + } + + + @Override + public boolean sqlMapSelectOneByExampleWithBLOBsElementGenerated(Document document, XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); + xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS_FOR_UPDATE)); + commentGenerator.addComment(xmlElement); + this.selectOneByExampleWithBLOBsForUpdateEle = xmlElement; + return true; + } + + private XmlElement cloneAndAddForUpdateElement(XmlElement element) { + XmlElement clone = XmlElementTools.clone(element); + clone.getAttributes().removeIf(a -> "id".equals(a.getName())); + clone.addElement(new TextElement("for update")); + return clone; + } + + + @Override + public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { + + if (selectByPrimaryKeyForUpdateEle != null) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectByPrimaryKeyForUpdateEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectByPrimaryKeyForUpdate方法。"); + } + if (selectByExampleForUpdateEle != null) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectByExampleForUpdateEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectByExampleForUpdate方法。"); + } + + if (selectByExampleWithBLOBsForUpdateEle != null) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectByExampleWithBLOBsForUpdateEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + } + + + if (selectOneByExampleForUpdateEle != null) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleForUpdateEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExample方法。"); + } + + if (selectOneByExampleWithBLOBsForUpdateEle != null) { + // 添加到根节点 + FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsForUpdateEle); + logger.debug("itfsw(forUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); + } + + return true; + } + + +} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java deleted file mode 100644 index db3243fd..00000000 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectOneByExampleForUpdatePlugin.java +++ /dev/null @@ -1,216 +0,0 @@ - -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 SelectOneByExampleForUpdatePlugin extends BasePlugin { - public static final String METHOD_SELECT_ONE_BY_EXAMPLE = "selectOneByExampleForUpdate"; // 方法名 - public static final String METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS = "selectOneByExampleWithBLOBsForUpdate"; // 方法名 - private XmlElement selectOneByExampleEle; - private XmlElement selectOneByExampleWithBLOBsEle; - - @Override - public void initialized(IntrospectedTable introspectedTable) { - super.initialized(introspectedTable); - // bug:26,27 - this.selectOneByExampleWithBLOBsEle = null; - this.selectOneByExampleEle = 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) { - // 方法生成 selectOneByExample - Method selectOneMethod = JavaElementGeneratorTools.generateMethod( - METHOD_SELECT_ONE_BY_EXAMPLE_WITH_BLOBS, - JavaVisibility.DEFAULT, - JavaElementGeneratorTools.getModelTypeWithBLOBs(introspectedTable), - new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") - ); - commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); - - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithBLOBsMethodGenerated(selectOneMethod, interfaze, introspectedTable)) { - // interface 增加方法 - FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); - logger.debug("itfsw(ForUpdate):" + interfaze.getType().getShortName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); - } - 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) { - // 方法生成 selectOneByExample - Method selectOneMethod = JavaElementGeneratorTools.generateMethod( - METHOD_SELECT_ONE_BY_EXAMPLE, - JavaVisibility.DEFAULT, - JavaElementGeneratorTools.getModelTypeWithoutBLOBs(introspectedTable), - new Parameter(new FullyQualifiedJavaType(introspectedTable.getExampleType()), "example") - ); - commentGenerator.addGeneralMethodComment(selectOneMethod, introspectedTable); - - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).clientSelectOneByExampleWithoutBLOBsMethodGenerated(selectOneMethod, interfaze, introspectedTable)) { - // interface 增加方法 - FormatTools.addMethodWithBestPosition(interfaze, selectOneMethod); - logger.debug("itfsw(ForUpdate):" + interfaze.getType().getShortName() + "增加selectOneByExampleForUpdate方法。"); - } - return super.clientSelectByExampleWithoutBLOBsMethodGenerated(selectOneMethod, 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_ONE_BY_EXAMPLE)); - // 添加返回类型 - selectOneElement.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId())); - // 添加参数类型 - selectOneElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); - selectOneElement.addElement(new TextElement("select")); - - 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.getExampleIncludeElement(introspectedTable)); - - XmlElement ifElement = new XmlElement("if"); - ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ - ifElement.addElement(new TextElement("order by ${orderByClause}")); - selectOneElement.addElement(ifElement); - - // 只查询一条 - selectOneElement.addElement(new TextElement("limit 1")); - selectOneElement.addElement(new TextElement(" for update")); - - this.selectOneByExampleEle = 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_ONE_BY_EXAMPLE_WITH_BLOBS)); - // 添加返回类型 - selectOneWithBLOBsElement.addAttribute(new Attribute("resultMap", introspectedTable.getResultMapWithBLOBsId())); - // 添加参数类型 - selectOneWithBLOBsElement.addAttribute(new Attribute("parameterType", introspectedTable.getExampleType())); - // 添加查询SQL - selectOneWithBLOBsElement.addElement(new TextElement("select")); - - 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.getExampleIncludeElement(introspectedTable)); - - XmlElement ifElement1 = new XmlElement("if"); - ifElement1.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-2$ - ifElement1.addElement(new TextElement("order by ${orderByClause}")); - selectOneWithBLOBsElement.addElement(ifElement1); - - // 只查询一条 - selectOneWithBLOBsElement.addElement(new TextElement("limit 1")); - selectOneWithBLOBsElement.addElement(new TextElement(" for update")); - - - this.selectOneByExampleWithBLOBsEle = selectOneWithBLOBsElement; - return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); - } - - @Override - public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { - if (selectOneByExampleEle != null) { - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithoutBLOBsElementGenerated(document, selectOneByExampleEle, introspectedTable)) { - // 添加到根节点 - FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleEle); - logger.debug("itfsw(ForUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleForUpdate方法。"); - } - } - - if (selectOneByExampleWithBLOBsEle != null) { - // hook - if (PluginTools.getHook(ISelectOneByExamplePluginHook.class).sqlMapSelectOneByExampleWithBLOBsElementGenerated(document, selectOneByExampleWithBLOBsEle, introspectedTable)) { - // 添加到根节点 - FormatTools.addElementWithBestPosition(document.getRootElement(), selectOneByExampleWithBLOBsEle); - logger.debug("itfsw(ForUpdate插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加selectOneByExampleWithBLOBsForUpdate方法。"); - } - } - - return true; - } - -} diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SerializablePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SerializablePlugin.java new file mode 100644 index 00000000..49ab69d1 --- /dev/null +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SerializablePlugin.java @@ -0,0 +1,71 @@ +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +import java.io.Serializable; +import java.util.Set; + +/** + * @author durenhao + * @date 2021/4/16 20:51 + **/ +public class SerializablePlugin extends BasePlugin implements Serializable { + + /** + * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html + * + * @param topLevelClass + * @param introspectedTable + * @return + */ + @Override + public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + this.addSerializableInterface(topLevelClass, introspectedTable); + return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); + } + + /** + * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html + * + * @param topLevelClass + * @param introspectedTable + * @return + */ + @Override + public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + this.addSerializableInterface(topLevelClass, introspectedTable); + return super.modelPrimaryKeyClassGenerated(topLevelClass, introspectedTable); + } + + /** + * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html + * + * @param topLevelClass + * @param introspectedTable + * @return + */ + @Override + public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + this.addSerializableInterface(topLevelClass, introspectedTable); + return super.modelRecordWithBLOBsClassGenerated(topLevelClass, introspectedTable); + } + + + private void addSerializableInterface(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + + Set superInterfaceTypes = topLevelClass.getSuperInterfaceTypes(); + boolean match = superInterfaceTypes.stream() + .anyMatch(f -> f.getFullyQualifiedName().equals("java.io.Serializable")); + + if (!match) { + FullyQualifiedJavaType listType = new FullyQualifiedJavaType("java.io.Serializable"); + topLevelClass.addSuperInterface(listType); + topLevelClass.addImportedType("java.io.Serializable"); + } + + } + +} diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java deleted file mode 100644 index 46122f93..00000000 --- a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectByExampleForUpdatePluginTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.itfsw.mybatis.generator.plugins; - -import com.itfsw.mybatis.generator.plugins.tools.*; -import org.apache.ibatis.session.SqlSession; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.List; - -/** - * @author durenhao - * @date 2021/4/14 23:42 - **/ -public class SelectByExampleForUpdatePluginTest { - - - @BeforeClass - public static void init() throws Exception { - DBHelper.createDB("scripts/SelectByExampleForUpdatePlugin/init.sql"); - } - - - @Test - public void testForUpdate() throws Exception { - - MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectByExampleForUpdatePlugin/mybatis-generator.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 TbExample = new ObjectUtil(loader, packagz + ".TbExample"); - ObjectUtil criteria = new ObjectUtil(TbExample.invoke("createCriteria")); - criteria.invoke("andIdEqualTo", 1l); - - // sql - String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleForUpdate", TbExample.getObject()); - Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '1' ) for update"); - Object result = tbMapper.invoke("selectByExampleForUpdate", TbExample.getObject()); - - ObjectUtil Tb = new ObjectUtil(((List)result).get(0)); - Assert.assertEquals(Tb.get("id"), 1l); - Assert.assertEquals(Tb.get("field1"), "fd1"); - Assert.assertNull(Tb.get("field2")); - } - }); - } - - @Test - public void testForUpdateWithBLOBs() throws Exception{ - MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml"); - tool.generate(new AbstractShellCallback() { - @Override - public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { - ObjectUtil TbBlobsMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper"))); - - ObjectUtil TbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample"); - ObjectUtil criteria = new ObjectUtil(TbBlobsExample.invoke("createCriteria")); - criteria.invoke("andIdEqualTo", 1l); - - // sql - String sql = SqlHelper.getFormatMapperSql(TbBlobsMapper.getObject(), "selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); - Assert.assertEquals(sql, "select id, field1 , field2, field3 from tb_blobs WHERE ( id = '1' ) for update"); - Object result = TbBlobsMapper.invoke("selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); - ObjectUtil Tb = new ObjectUtil(((List)result).get(0)); - Assert.assertEquals(Tb.get("id"), 1l); - Assert.assertEquals(Tb.get("field1"), "fd1"); - Assert.assertEquals(Tb.get("field2"), "fd2"); - } - }); - } - -} diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java new file mode 100644 index 00000000..5ccbbb78 --- /dev/null +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java @@ -0,0 +1,149 @@ +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.tools.*; +import org.apache.ibatis.session.SqlSession; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +/** + * @author durenhao + * @date 2021/4/14 23:42 + **/ +public class SelectForUpdatePluginPluginTest { + + @BeforeClass + public static void init() throws Exception { + DBHelper.createDB("scripts/SelectForUpdatePlugin/init.sql"); + } + + @Test + public void testSelectByPrimaryKeyForUpdate() throws Exception { + + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator.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"))); + + // sql + String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), + "selectByPrimaryKeyForUpdate", 1L); + Assert.assertEquals(sql, "select id, field1, field2 from tb where id = 1 for update"); + Object result = tbMapper.invoke("selectByPrimaryKeyForUpdate", 1L); + + ObjectUtil Tb = new ObjectUtil(result); + Assert.assertEquals(Tb.get("id"), 1L); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertNull(Tb.get("field2")); + } + }); + } + + + @Test + public void testSelectByExampleForUpdate() throws Exception { + + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator.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 TbExample = new ObjectUtil(loader, packagz + ".TbExample"); + ObjectUtil criteria = new ObjectUtil(TbExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectByExampleForUpdate", TbExample.getObject()); + Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '1' ) for update"); + Object result = tbMapper.invoke("selectByExampleForUpdate", TbExample.getObject()); + + ObjectUtil Tb = new ObjectUtil(((List) result).get(0)); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertNull(Tb.get("field2")); + } + }); + } + + + @Test + public void testSelectByExampleWithBLOBsForUpdate() throws Exception { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator.xml"); + tool.generate(new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + ObjectUtil TbBlobsMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper"))); + + ObjectUtil TbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample"); + ObjectUtil criteria = new ObjectUtil(TbBlobsExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(TbBlobsMapper.getObject(), "selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + Assert.assertEquals(sql, "select id, field1 , field2, field3 from tb_blobs WHERE ( id = '1' ) for update"); + Object result = TbBlobsMapper.invoke("selectByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + ObjectUtil Tb = new ObjectUtil(((List) result).get(0)); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertEquals(Tb.get("field2"), "fd2"); + } + }); + } + + + @Test + public void testSelectOneByExampleForUpdate() throws Exception { + + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator.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 TbExample = new ObjectUtil(loader, packagz + ".TbExample"); + ObjectUtil criteria = new ObjectUtil(TbExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "selectOneByExampleForUpdate", TbExample.getObject()); + Assert.assertEquals(sql, "select id, field1, field2 from tb WHERE ( id = '1' ) limit 1 for update"); + Object result = tbMapper.invoke("selectOneByExampleForUpdate", TbExample.getObject()); + + ObjectUtil Tb = new ObjectUtil(result); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertNull(Tb.get("field2")); + } + }); + } + + + @Test + public void testSelectOneByExampleWithBLOBsForUpdate() throws Exception { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator.xml"); + tool.generate(new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + ObjectUtil TbBlobsMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbBlobsMapper"))); + + ObjectUtil TbBlobsExample = new ObjectUtil(loader, packagz + ".TbBlobsExample"); + ObjectUtil criteria = new ObjectUtil(TbBlobsExample.invoke("createCriteria")); + criteria.invoke("andIdEqualTo", 1l); + + // sql + String sql = SqlHelper.getFormatMapperSql(TbBlobsMapper.getObject(), "selectOneByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + Assert.assertEquals(sql, "select id, field1 , field2, field3 from tb_blobs WHERE ( id = '1' ) limit 1 for update"); + Object result = TbBlobsMapper.invoke("selectOneByExampleWithBLOBsForUpdate", TbBlobsExample.getObject()); + ObjectUtil Tb = new ObjectUtil(result); + Assert.assertEquals(Tb.get("id"), 1l); + Assert.assertEquals(Tb.get("field1"), "fd1"); + Assert.assertEquals(Tb.get("field2"), "fd2"); + } + }); + } + +} diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/SerializablePluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/SerializablePluginTest.java new file mode 100644 index 00000000..c1424848 --- /dev/null +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/SerializablePluginTest.java @@ -0,0 +1,77 @@ +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback; +import com.itfsw.mybatis.generator.plugins.tools.DBHelper; +import com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool; +import com.itfsw.mybatis.generator.plugins.tools.ObjectUtil; +import org.apache.ibatis.session.SqlSession; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mybatis.generator.api.GeneratedJavaFile; +import org.mybatis.generator.api.MyBatisGenerator; +import org.mybatis.generator.api.dom.java.CompilationUnit; +import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Set; + +public class SerializablePluginTest { + + @BeforeClass + public static void init() throws Exception { + DBHelper.createDB("scripts/LombokPlugin/init.sql"); + } + + @Test + public void testGenerate() throws Exception { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SerializablePlugin/mybatis-generator.xml"); + MyBatisGenerator myBatisGenerator = tool.generate(); + + for (GeneratedJavaFile file : myBatisGenerator.getGeneratedJavaFiles()) { + CompilationUnit compilationUnit = file.getCompilationUnit(); + if (compilationUnit instanceof TopLevelClass) { + TopLevelClass topLevelClass = (TopLevelClass) compilationUnit; + String name = topLevelClass.getType().getShortName(); + if ("Tb".equals(name) || "TbBlobs".equals(name)) { + Set superInterfaceTypes = compilationUnit.getSuperInterfaceTypes(); + boolean match = superInterfaceTypes.stream() + .anyMatch(f -> f.getFullyQualifiedName().equals("java.io.Serializable")); + Assert.assertTrue(match); + } + } + + } + } + + @Test + public void testSerialize() throws Exception { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SerializablePlugin/mybatis-generator.xml"); + tool.generate(new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + // get & set + ObjectUtil objectUtil = new ObjectUtil(loader, packagz + ".Tb"); + objectUtil.invoke("setId", 1l); + Object object = objectUtil.getObject(); + String path = loader.getResource("").getPath(); + String target = packagz.replaceAll("\\.", "/"); + String fileName = path + target + "/tbSerialize"; + try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { + objectOutputStream.writeObject(object); + } + try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(fileName))) { + Object readObject = objectInputStream.readObject(); + ObjectUtil objectUtil1 = new ObjectUtil(readObject); + Object id = objectUtil1.invoke("getId"); + Assert.assertEquals(id, 1L); + } + } + }); + } + +} \ No newline at end of file diff --git a/src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql b/src/test/resources/scripts/SelectForUpdatePlugin/init.sql similarity index 100% rename from src/test/resources/scripts/SelectByExampleForUpdatePlugin/init.sql rename to src/test/resources/scripts/SelectForUpdatePlugin/init.sql diff --git a/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml new file mode 100644 index 00000000..dacf3fb7 --- /dev/null +++ b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/test/resources/scripts/SerializablePlugin/init.sql b/src/test/resources/scripts/SerializablePlugin/init.sql new file mode 100644 index 00000000..1f0955c4 --- /dev/null +++ b/src/test/resources/scripts/SerializablePlugin/init.sql @@ -0,0 +1,70 @@ +/* +Navicat MySQL Data Transfer + +Source Server : localhost +Source Server Version : 50617 +Source Host : localhost:3306 +Source Database : mybatis-generator-plugin + +Target Server Type : MYSQL +Target Server Version : 50617 +File Encoding : 65001 + +Date: 2017-07-03 17:34:11 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for tb +-- ---------------------------- +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` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb +-- ---------------------------- +INSERT INTO `tb` VALUES ('1', 'fd1', null); +INSERT INTO `tb` VALUES ('2', null, '2'); +INSERT INTO `tb` VALUES ('3', 'fd3', '3'); + +-- ---------------------------- +-- Table structure for tb_blobs +-- ---------------------------- +DROP TABLE IF EXISTS `tb_blobs`; +CREATE TABLE `tb_blobs` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `field1` varchar(255) DEFAULT NULL, + `field2` longtext COMMENT '注释2', + `field3` longtext, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb_blobs +-- ---------------------------- +INSERT INTO `tb_blobs` VALUES ('1', 'fd1', 'fd2', null); + +-- ---------------------------- +-- Table structure for tb_keys +-- ---------------------------- +DROP TABLE IF EXISTS `tb_keys`; +CREATE TABLE `tb_keys` ( + `key1` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `key2` varchar(255) NOT NULL, + `field1` varchar(255) DEFAULT NULL COMMENT '注释2', + `field2` int(11) DEFAULT NULL, + PRIMARY KEY (`key1`,`key2`) +) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of tb_keys +-- ---------------------------- +INSERT INTO `tb_keys` VALUES ('1', '2', 'fd1', null); +INSERT INTO `tb_keys` VALUES ('2', '3', null, '2'); +INSERT INTO `tb_keys` VALUES ('3', '4', 'fd2', '3'); diff --git a/src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml b/src/test/resources/scripts/SerializablePlugin/mybatis-generator.xml similarity index 96% rename from src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml rename to src/test/resources/scripts/SerializablePlugin/mybatis-generator.xml index 94623a8e..f928e0e6 100644 --- a/src/test/resources/scripts/SelectByExampleForUpdatePlugin/mybatis-generator.xml +++ b/src/test/resources/scripts/SerializablePlugin/mybatis-generator.xml @@ -23,7 +23,7 @@ - + From 33f6949f4e7bad54f63b0d54283ca01098f99599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E4=BB=81=E6=B5=A9?= Date: Fri, 16 Apr 2021 22:56:20 +0800 Subject: [PATCH 3/4] local --- src/test/resources/db.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/db.properties b/src/test/resources/db.properties index edce0393..9dea2226 100644 --- a/src/test/resources/db.properties +++ b/src/test/resources/db.properties @@ -15,6 +15,6 @@ # driver=com.mysql.cj.jdbc.Driver -url=jdbc:mysql://106.12.208.53:3306/mybatis-generator-plugin?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true +url=jdbc:mysql://localhost:3306/mybatis-generator-plugin?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username=root -password=ak402507979!@# \ No newline at end of file +password=root \ No newline at end of file From bcafdae9b305a78fbed142510dd70b9c3e0246c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E4=BB=81=E6=B5=A9?= Date: Sat, 17 Apr 2021 12:14:24 +0800 Subject: [PATCH 4/4] =?UTF-8?q?for=20update=20=E6=8F=92=E4=BB=B6=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/SelectForUpdatePlugin.java | 34 ++++++++++- .../SelectForUpdatePluginPluginTest.java | 13 ++++- .../mybatis-generator-limit.xml | 56 +++++++++++++++++++ .../mybatis-generator.xml | 2 + 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator-limit.xml diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java index add9794c..86dc3edb 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePlugin.java @@ -7,12 +7,15 @@ import com.itfsw.mybatis.generator.plugins.utils.hook.ISelectOneByExamplePluginHook; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.Plugin; 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 org.mybatis.generator.internal.PluginAggregator; +import java.lang.reflect.Field; import java.util.List; /** @@ -47,6 +50,11 @@ public class SelectForUpdatePlugin extends BasePlugin implements ISelectOneByExa @Override public void initialized(IntrospectedTable introspectedTable) { super.initialized(introspectedTable); + try { + validatePluginOrder(); + } catch (Exception e) { + throw new RuntimeException(e); + } this.selectByPrimaryKeyForUpdateEle = null; this.selectByExampleForUpdateEle = null; @@ -59,7 +67,6 @@ public void initialized(IntrospectedTable introspectedTable) { @Override public boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { - FullyQualifiedJavaType baseRecordType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()); FullyQualifiedJavaType listType = new FullyQualifiedJavaType("java.util.List"); listType.addTypeArgument(baseRecordType); @@ -177,6 +184,7 @@ public boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, Intr */ @Override public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + XmlElement xmlElement = cloneAndAddForUpdateElement(element); xmlElement.addAttribute(new Attribute("id", METHOD_SELECT_BY_EXAMPLE_FOR_UPDATE)); commentGenerator.addComment(xmlElement); @@ -184,6 +192,30 @@ public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement elem return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable); } + + private void validatePluginOrder() throws Exception { + PluginAggregator plugins = (PluginAggregator) getContext().getPlugins(); + Field field = PluginAggregator.class.getDeclaredField("plugins"); + field.setAccessible(true); + List pluginList = (List) field.get(plugins); + int forUpdateOrder = 0; + int limitOrder = -1; + for (int i = 0; i < pluginList.size(); i++) { + if (pluginList.get(i) instanceof SelectForUpdatePlugin) { + forUpdateOrder = i; + } + if (pluginList.get(i) instanceof LimitPlugin) { + limitOrder = i; + } + } + if (limitOrder == -1) { + return; + } + if (limitOrder > forUpdateOrder) { + throw new IllegalStateException("SelectForUpdatePlugin的顺序必须在LimitPlugin之后,请调整插件顺序"); + } + } + @Override public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { XmlElement xmlElement = cloneAndAddForUpdateElement(element); diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java index 5ccbbb78..80ad3bf5 100644 --- a/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/SelectForUpdatePluginPluginTest.java @@ -42,7 +42,6 @@ public void reloadProject(SqlSession sqlSession, ClassLoader loader, String pack }); } - @Test public void testSelectByExampleForUpdate() throws Exception { @@ -146,4 +145,16 @@ public void reloadProject(SqlSession sqlSession, ClassLoader loader, String pack }); } + @Test + public void testWithLimitPlugin() throws Exception { + + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/SelectForUpdatePlugin/mybatis-generator-limit.xml"); + try { + tool.generate(); + } catch (Exception e) { + Assert.assertTrue(e.getCause() instanceof IllegalStateException); + Assert.assertTrue("SelectForUpdatePlugin的顺序必须在LimitPlugin之后,请调整插件顺序".equals(e.getCause().getMessage())); + } + } + } diff --git a/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator-limit.xml b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator-limit.xml new file mode 100644 index 00000000..693fc686 --- /dev/null +++ b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator-limit.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
\ No newline at end of file diff --git a/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml index dacf3fb7..dc877899 100644 --- a/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml +++ b/src/test/resources/scripts/SelectForUpdatePlugin/mybatis-generator.xml @@ -25,6 +25,8 @@ + +