Commit 09065650 authored by hewei's avatar hewei

重构代码插件依赖关系

parent c33616c4
...@@ -339,7 +339,17 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin ...@@ -339,7 +339,17 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin
*/ */
@Override @Override
public boolean sqlMapUpsertByExampleSelectiveElementGenerated(XmlElement element, List<IntrospectedColumn> columns, XmlElement insertColumnsEle, XmlElement insertValuesEle, XmlElement setsEle, IntrospectedTable introspectedTable) { public boolean sqlMapUpsertByExampleSelectiveElementGenerated(XmlElement element, List<IntrospectedColumn> columns, XmlElement insertColumnsEle, XmlElement insertValuesEle, XmlElement setsEle, IntrospectedTable introspectedTable) {
return false;
// 替换insert column
XmlElementGeneratorTools.replaceXmlElement(insertColumnsEle, this.generateInsertColumnSelective(columns));
// 替换insert values
XmlElementGeneratorTools.replaceXmlElement(insertValuesEle, this.generateInsertValuesSelective(columns, false));
// 替换update set
XmlElementGeneratorTools.replaceXmlElement(setsEle, this.generateSetsSelective(columns));
return true;
} }
// ====================================================== 一些私有节点生成方法 ========================================================= // ====================================================== 一些私有节点生成方法 =========================================================
...@@ -384,6 +394,16 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin ...@@ -384,6 +394,16 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin
* @return * @return
*/ */
private XmlElement generateInsertValuesSelective(List<IntrospectedColumn> columns) { private XmlElement generateInsertValuesSelective(List<IntrospectedColumn> columns) {
return generateInsertValuesSelective(columns, true);
}
/**
* insert column selective
* @param columns
* @param bracket
* @return
*/
private XmlElement generateInsertValuesSelective(List<IntrospectedColumn> columns, boolean bracket) {
XmlElement insertValuesChooseEle = new XmlElement("choose"); XmlElement insertValuesChooseEle = new XmlElement("choose");
XmlElement valuesWhenEle = new XmlElement("when"); XmlElement valuesWhenEle = new XmlElement("when");
...@@ -393,15 +413,17 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin ...@@ -393,15 +413,17 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin
XmlElement valuesForeachEle = new XmlElement("foreach"); XmlElement valuesForeachEle = new XmlElement("foreach");
valuesForeachEle.addAttribute(new Attribute("collection", "selective")); valuesForeachEle.addAttribute(new Attribute("collection", "selective"));
valuesForeachEle.addAttribute(new Attribute("item", "column")); valuesForeachEle.addAttribute(new Attribute("item", "column"));
valuesForeachEle.addAttribute(new Attribute("open", "("));
valuesForeachEle.addAttribute(new Attribute("separator", ",")); valuesForeachEle.addAttribute(new Attribute("separator", ","));
valuesForeachEle.addAttribute(new Attribute("close", ")")); if (bracket) {
valuesForeachEle.addAttribute(new Attribute("open", "("));
valuesForeachEle.addAttribute(new Attribute("close", ")"));
}
valuesForeachEle.addElement(new TextElement("#{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); valuesForeachEle.addElement(new TextElement("#{record.${column.javaProperty},jdbcType=${column.jdbcType}}"));
valuesWhenEle.addElement(valuesForeachEle); valuesWhenEle.addElement(valuesForeachEle);
XmlElement valuesOtherwiseEle = new XmlElement("otherwise"); XmlElement valuesOtherwiseEle = new XmlElement("otherwise");
insertValuesChooseEle.addElement(valuesOtherwiseEle); insertValuesChooseEle.addElement(valuesOtherwiseEle);
valuesOtherwiseEle.addElement(XmlElementGeneratorTools.generateValuesSelective(columns, "record.")); valuesOtherwiseEle.addElement(XmlElementGeneratorTools.generateValuesSelective(columns, "record.", bracket));
return insertValuesChooseEle; return insertValuesChooseEle;
} }
......
...@@ -217,7 +217,7 @@ public class UpsertPlugin extends BasePlugin { ...@@ -217,7 +217,7 @@ public class UpsertPlugin extends BasePlugin {
insertEle.addAttribute(new Attribute("parameterType", introspectedTable.getRules().calculateAllFieldsClass().getFullyQualifiedName())); insertEle.addAttribute(new Attribute("parameterType", introspectedTable.getRules().calculateAllFieldsClass().getFullyQualifiedName()));
// 使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。所以只支持MYSQL和SQLServer // 使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。所以只支持MYSQL和SQLServer
XmlElementGeneratorTools.useGeneratedKeys(insertEle, introspectedTable); XmlElementGeneratorTools.useGeneratedKeys(insertEle, introspectedTable, "record.");
// insert // insert
insertEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime())); insertEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime()));
...@@ -349,7 +349,7 @@ public class UpsertPlugin extends BasePlugin { ...@@ -349,7 +349,7 @@ public class UpsertPlugin extends BasePlugin {
// insert // insert
updateEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime())); updateEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime()));
for (Element element : XmlElementGeneratorTools.generateKeys(columns)) { for (Element element : XmlElementGeneratorTools.generateKeys(columns, "record.")) {
updateEle.addElement(element); updateEle.addElement(element);
} }
this.generateExistsClause(introspectedTable, updateEle, XmlElementGeneratorTools.generateValues(columns, "record.", false)); this.generateExistsClause(introspectedTable, updateEle, XmlElementGeneratorTools.generateValues(columns, "record.", false));
......
...@@ -27,6 +27,7 @@ import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; ...@@ -27,6 +27,7 @@ import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.config.GeneratedKey; import org.mybatis.generator.config.GeneratedKey;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
...@@ -151,7 +152,7 @@ public class XmlElementGeneratorTools { ...@@ -151,7 +152,7 @@ public class XmlElementGeneratorTools {
* @param element * @param element
* @param name * @param name
*/ */
public static void removeAttribute(XmlElement element, String name){ public static void removeAttribute(XmlElement element, String name) {
Iterator<Attribute> iterator = element.getAttributes().iterator(); Iterator<Attribute> iterator = element.getAttributes().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Attribute attribute = iterator.next(); Attribute attribute = iterator.next();
...@@ -166,7 +167,7 @@ public class XmlElementGeneratorTools { ...@@ -166,7 +167,7 @@ public class XmlElementGeneratorTools {
* @param element * @param element
* @param attribute * @param attribute
*/ */
public static void replaceAttribute(XmlElement element, Attribute attribute){ public static void replaceAttribute(XmlElement element, Attribute attribute) {
removeAttribute(element, attribute.getName()); removeAttribute(element, attribute.getName());
element.addAttribute(attribute); element.addAttribute(attribute);
} }
...@@ -176,7 +177,7 @@ public class XmlElementGeneratorTools { ...@@ -176,7 +177,7 @@ public class XmlElementGeneratorTools {
* @param srcEle * @param srcEle
* @param destEle * @param destEle
*/ */
public static void replaceXmlElement(XmlElement srcEle, XmlElement destEle){ public static void replaceXmlElement(XmlElement srcEle, XmlElement destEle) {
srcEle.setName(destEle.getName()); srcEle.setName(destEle.getName());
srcEle.getAttributes().clear(); srcEle.getAttributes().clear();
srcEle.getAttributes().addAll(destEle.getAttributes()); srcEle.getAttributes().addAll(destEle.getAttributes());
...@@ -190,17 +191,28 @@ public class XmlElementGeneratorTools { ...@@ -190,17 +191,28 @@ public class XmlElementGeneratorTools {
* @return * @return
*/ */
public static List<Element> generateKeys(List<IntrospectedColumn> columns) { public static List<Element> generateKeys(List<IntrospectedColumn> columns) {
return generateKeys(columns, true); return generateKeys(columns, null);
} }
/** /**
* 生成keys Ele * 生成keys Ele
* @param columns * @param columns
* @param prefix
* @return
*/
public static List<Element> generateKeys(List<IntrospectedColumn> columns, String prefix) {
return generateKeys(columns, prefix, true);
}
/**
* 生成keys Ele
* @param columns
* @param prefix
* @param bracket * @param bracket
* @return * @return
*/ */
public static List<Element> generateKeys(List<IntrospectedColumn> columns, boolean bracket) { public static List<Element> generateKeys(List<IntrospectedColumn> columns,String prefix, boolean bracket) {
return generateCommColumns(columns, null, bracket, 1); return generateCommColumns(columns, prefix, bracket, 1);
} }
/** /**
...@@ -361,48 +373,80 @@ public class XmlElementGeneratorTools { ...@@ -361,48 +373,80 @@ public class XmlElementGeneratorTools {
* @param type 1:key,2:value,3:set * @param type 1:key,2:value,3:set
* @return * @return
*/ */
public static List<Element> generateCommColumns(List<IntrospectedColumn> columns, String prefix, boolean bracket, int type) { private static List<Element> generateCommColumns(List<IntrospectedColumn> columns, String prefix, boolean bracket, int type) {
List<Element> list = new ArrayList<>(); List<Element> list = new ArrayList<>();
StringBuilder sb = new StringBuilder(bracket ? "(" : "");
Iterator<IntrospectedColumn> columnIterator = columns.iterator();
while (columnIterator.hasNext()) {
IntrospectedColumn introspectedColumn = columnIterator.next();
switch (type) { if (hasIdentityAndGeneratedAlwaysColumns(columns)) {
case 3: XmlElement eleTrim = new XmlElement("trim");
sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn)); if (bracket) {
sb.append(" = "); eleTrim.addAttribute(new Attribute("prefix", "("));
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix)); eleTrim.addAttribute(new Attribute("suffix", ")"));
break; eleTrim.addAttribute(new Attribute("suffixOverrides", ","));
case 2: } else {
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix)); eleTrim.addAttribute(new Attribute("suffixOverrides", ","));
break;
case 1:
sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));
break;
} }
if (columnIterator.hasNext()) { for (IntrospectedColumn introspectedColumn : columns) {
sb.append(", "); if (introspectedColumn.isGeneratedAlways() || introspectedColumn.isIdentity()) {
generateSelectiveToTrimEle(eleTrim, introspectedColumn, prefix, type);
} else {
switch (type) {
case 3:
eleTrim.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + " = " + MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 2:
eleTrim.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 1:
eleTrim.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + ","));
break;
}
}
} }
// 保持和官方一致 80 进行换行 return Arrays.asList(eleTrim);
if (type == 1 || type == 2) { } else {
if (sb.length() > 80) { StringBuilder sb = new StringBuilder(bracket ? "(" : "");
Iterator<IntrospectedColumn> columnIterator = columns.iterator();
while (columnIterator.hasNext()) {
IntrospectedColumn introspectedColumn = columnIterator.next();
switch (type) {
case 3:
sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));
sb.append(" = ");
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix));
break;
case 2:
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix));
break;
case 1:
sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));
break;
}
if (columnIterator.hasNext()) {
sb.append(", ");
}
// 保持和官方一致 80 进行换行
if (type == 1 || type == 2) {
if (sb.length() > 80) {
list.add(new TextElement(sb.toString()));
sb.setLength(0);
OutputUtilities.xmlIndent(sb, 1);
}
} else {
list.add(new TextElement(sb.toString())); list.add(new TextElement(sb.toString()));
sb.setLength(0); sb.setLength(0);
OutputUtilities.xmlIndent(sb, 1);
} }
} else {
list.add(new TextElement(sb.toString()));
sb.setLength(0);
} }
} if (sb.length() > 0 || bracket) {
if (sb.length() > 0 || bracket) { list.add(new TextElement(sb.append(bracket ? ")" : "").toString()));
list.add(new TextElement(sb.append(bracket ? ")" : "").toString())); }
}
return list; return list;
}
} }
/** /**
...@@ -424,41 +468,52 @@ public class XmlElementGeneratorTools { ...@@ -424,41 +468,52 @@ public class XmlElementGeneratorTools {
} }
for (IntrospectedColumn introspectedColumn : columns) { for (IntrospectedColumn introspectedColumn : columns) {
if (type != 3 && (introspectedColumn.isSequenceColumn() || introspectedColumn.getFullyQualifiedJavaType().isPrimitive())) { generateSelectiveToTrimEle(eleTrim, introspectedColumn, prefix, type);
// if it is a sequence column, it is not optional }
// This is required for MyBatis3 because MyBatis3 parses
// and calculates the SQL before executing the selectKey
// if it is primitive, we cannot do a null check return eleTrim;
switch (type) { }
case 2:
eleTrim.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 1:
eleTrim.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + ","));
break;
}
} else {
XmlElement eleIf = new XmlElement("if");
eleIf.addAttribute(new Attribute("test", introspectedColumn.getJavaProperty(prefix) + " != null"));
switch (type) { /**
case 3: * 生成选择列到trim 节点
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + " = " + MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ",")); * @param trimEle
break; * @param introspectedColumn
case 2: * @param prefix
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ",")); * @param type 1:key,2:value,3:set
break; */
case 1: private static void generateSelectiveToTrimEle(XmlElement trimEle, IntrospectedColumn introspectedColumn, String prefix, int type) {
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + ",")); if (type != 3 && (introspectedColumn.isSequenceColumn() || introspectedColumn.getFullyQualifiedJavaType().isPrimitive())) {
break; // if it is a sequence column, it is not optional
} // This is required for MyBatis3 because MyBatis3 parses
// and calculates the SQL before executing the selectKey
// if it is primitive, we cannot do a null check
switch (type) {
case 2:
trimEle.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 1:
trimEle.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + ","));
break;
}
} else {
XmlElement eleIf = new XmlElement("if");
eleIf.addAttribute(new Attribute("test", introspectedColumn.getJavaProperty(prefix) + " != null"));
eleTrim.addElement(eleIf); switch (type) {
case 3:
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + " = " + MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 2:
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, prefix) + ","));
break;
case 1:
eleIf.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn) + ","));
break;
} }
}
return eleTrim; trimEle.addElement(eleIf);
}
} }
/** /**
...@@ -516,4 +571,18 @@ public class XmlElementGeneratorTools { ...@@ -516,4 +571,18 @@ public class XmlElementGeneratorTools {
element.addElement(new TextElement(sb.toString())); element.addElement(new TextElement(sb.toString()));
} }
} }
/**
* 是否存在自增或者生成的column
* @param columns
* @return
*/
private static boolean hasIdentityAndGeneratedAlwaysColumns(List<IntrospectedColumn> columns) {
for (IntrospectedColumn ic : columns) {
if (ic.isGeneratedAlways() || ic.isIdentity()) {
return true;
}
}
return false;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment