From 01f5e51ba05bbf0defb8a710b5e8e34b8342c522 Mon Sep 17 00:00:00 2001 From: hewei Date: Fri, 4 May 2018 14:34:18 +0800 Subject: [PATCH] =?UTF-8?q?upsert=20=E6=8F=92=E4=BB=B6key,value,set?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E5=8D=95=E7=8B=AC=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=92=8C=E5=88=AB=E7=9A=84=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/plugins/UpsertPlugin.java | 12 ++--- .../plugins/utils/IntrospectedTableTools.java | 21 +++++++-- .../utils/XmlElementGeneratorTools.java | 46 ++++++++++++++++++- .../InnerTypeFullyQualifiedJavaType.java | 6 +-- 4 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java index 4371a04..d58f946 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java @@ -304,16 +304,16 @@ public class UpsertPlugin extends BasePlugin { // insert insertEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime())); - for (Element element : XmlElementGeneratorTools.generateKeys(columns)) { + for (Element element : XmlElementGeneratorTools.generateUpsertKeys(columns, null)) { insertEle.addElement(element); } insertEle.addElement(new TextElement("values")); - for (Element element : XmlElementGeneratorTools.generateValues(columns)) { + for (Element element : XmlElementGeneratorTools.generateUpsertValues(columns, null, true)) { insertEle.addElement(element); } insertEle.addElement(new TextElement("on duplicate key update ")); // set - for (Element set : XmlElementGeneratorTools.generateSets(columns)) { + for (Element set : XmlElementGeneratorTools.generateUpsertSets(columns, null)) { insertEle.addElement(set); } @@ -337,7 +337,7 @@ public class UpsertPlugin extends BasePlugin { updateEle.addElement(new TextElement("update " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime())); updateEle.addElement(new TextElement("set")); // set - for (Element set : XmlElementGeneratorTools.generateSets(columns, "record.")) { + for (Element set : XmlElementGeneratorTools.generateUpsertSets(columns, "record.")) { updateEle.addElement(set); } @@ -349,10 +349,10 @@ public class UpsertPlugin extends BasePlugin { // insert updateEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime())); - for (Element element : XmlElementGeneratorTools.generateKeys(columns, "record.")) { + for (Element element : XmlElementGeneratorTools.generateUpsertKeys(columns, "record.")) { updateEle.addElement(element); } - this.generateExistsClause(introspectedTable, updateEle, XmlElementGeneratorTools.generateValues(columns, "record.", false)); + this.generateExistsClause(introspectedTable, updateEle, XmlElementGeneratorTools.generateUpsertValues(columns, "record.", false)); document.getRootElement().addElement(updateEle); logger.debug("itfsw(存在即更新插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加upsertByExample实现方法。"); diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/IntrospectedTableTools.java b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/IntrospectedTableTools.java index 2bf330f..581ab17 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/IntrospectedTableTools.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/IntrospectedTableTools.java @@ -17,6 +17,7 @@ package com.itfsw.mybatis.generator.plugins.utils; import com.itfsw.mybatis.generator.plugins.ExampleTargetPlugin; +import org.mybatis.generator.api.FullyQualifiedTable; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.config.Context; @@ -24,7 +25,9 @@ import org.mybatis.generator.config.JavaModelGeneratorConfiguration; import org.mybatis.generator.config.PluginConfiguration; import org.mybatis.generator.internal.util.StringUtility; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; /** * --------------------------------------------------------------------------- @@ -49,12 +52,22 @@ public class IntrospectedTableTools { introspectedTable.getTableConfiguration().setDomainObjectName(domainObjectName); // FullyQualifiedTable修正 - BeanUtils.setProperty(introspectedTable.getFullyQualifiedTable(), "domainObjectName", domainObjectName); + Field domainObjectNameField = FullyQualifiedTable.class.getDeclaredField("domainObjectName"); + domainObjectNameField.setAccessible(true); + domainObjectNameField.set(introspectedTable.getFullyQualifiedTable(), domainObjectName); // 重新修正introspectedTable属性信息 - BeanUtils.invoke(introspectedTable, "calculateJavaClientAttributes"); - BeanUtils.invoke(introspectedTable, "calculateModelAttributes"); - BeanUtils.invoke(introspectedTable, "calculateXmlAttributes"); + Method calculateJavaClientAttributes = IntrospectedTable.class.getDeclaredMethod("calculateJavaClientAttributes"); + calculateJavaClientAttributes.setAccessible(true); + calculateJavaClientAttributes.invoke(introspectedTable); + + Method calculateModelAttributes = IntrospectedTable.class.getDeclaredMethod("calculateModelAttributes"); + calculateModelAttributes.setAccessible(true); + calculateModelAttributes.invoke(introspectedTable); + + Method calculateXmlAttributes = IntrospectedTable.class.getDeclaredMethod("calculateXmlAttributes"); + calculateXmlAttributes.setAccessible(true); + calculateXmlAttributes.invoke(introspectedTable); // 注意!! 如果配置了ExampleTargetPlugin插件,要修正Example 位置 PluginConfiguration configuration = PluginTools.getPluginConfiguration(context, ExampleTargetPlugin.class); diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/XmlElementGeneratorTools.java b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/XmlElementGeneratorTools.java index b3eeef0..654f068 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/XmlElementGeneratorTools.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/XmlElementGeneratorTools.java @@ -284,6 +284,37 @@ public class XmlElementGeneratorTools { return generateCommColumnsSelective(columns, prefix, false, 3); } + /** + * 生成keys Ele (upsert) + * @param columns + * @param prefix + * @return + */ + public static List generateUpsertKeys(List columns, String prefix) { + return generateCommColumns(columns, prefix, true, 1, true); + } + + /** + * 生成values Ele (upsert) + * @param columns + * @param prefix + * @param bracket + * @return + */ + public static List generateUpsertValues(List columns, String prefix, boolean bracket) { + return generateCommColumns(columns, prefix, bracket, 2, true); + } + + /** + * 生成sets Ele (upsert) + * @param columns + * @param prefix + * @return + */ + public static List generateUpsertSets(List columns, String prefix) { + return generateCommColumns(columns, prefix, false, 3, true); + } + /** * 通用遍历columns * @param columns @@ -293,10 +324,23 @@ public class XmlElementGeneratorTools { * @return */ private static List generateCommColumns(List columns, String prefix, boolean bracket, int type) { + return generateCommColumns(columns, prefix, bracket, type, false); + } + + /** + * 通用遍历columns + * @param columns + * @param prefix + * @param bracket + * @param type 1:key,2:value,3:set + * @param upsert + * @return + */ + private static List generateCommColumns(List columns, String prefix, boolean bracket, int type, boolean upsert) { List list = new ArrayList<>(); // 只有upsert插件才会传入 IdentityAndGeneratedAlwaysColumn - if (hasIdentityAndGeneratedAlwaysColumns(columns)) { + if (upsert && hasIdentityAndGeneratedAlwaysColumns(columns)) { XmlElement trimEle = generateTrim(bracket); for (IntrospectedColumn introspectedColumn : columns) { diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/enhanced/InnerTypeFullyQualifiedJavaType.java b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/enhanced/InnerTypeFullyQualifiedJavaType.java index 94806ab..277acf4 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/utils/enhanced/InnerTypeFullyQualifiedJavaType.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/utils/enhanced/InnerTypeFullyQualifiedJavaType.java @@ -16,7 +16,6 @@ package com.itfsw.mybatis.generator.plugins.utils.enhanced; -import com.itfsw.mybatis.generator.plugins.utils.BeanUtils; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,9 +40,10 @@ public class InnerTypeFullyQualifiedJavaType extends FullyQualifiedJavaType { try{ // 修正package + java.lang.reflect.Field packageName = this.getClass().getSuperclass().getDeclaredField("packageName"); + packageName.setAccessible(true); String oldPackageName = getPackageName(); - - BeanUtils.setProperty(this, "packageName", oldPackageName.substring(0, oldPackageName.lastIndexOf("."))); + packageName.set(this, oldPackageName.substring(0, oldPackageName.lastIndexOf("."))); outerType = oldPackageName.substring(oldPackageName.lastIndexOf(".") + 1); } catch (Exception e){