Commit e8c4641f authored by hewei's avatar hewei

乐观锁插件实现

parent d38e66e5
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
package com.itfsw.mybatis.generator.plugins; package com.itfsw.mybatis.generator.plugins;
import com.itfsw.mybatis.generator.plugins.utils.BasePlugin; import com.itfsw.mybatis.generator.plugins.utils.BasePlugin;
import com.itfsw.mybatis.generator.plugins.utils.BeanUtils;
import com.itfsw.mybatis.generator.plugins.utils.FormatTools; import com.itfsw.mybatis.generator.plugins.utils.FormatTools;
import com.itfsw.mybatis.generator.plugins.utils.XmlElementGeneratorTools;
import com.itfsw.mybatis.generator.plugins.utils.XmlElementTools; import com.itfsw.mybatis.generator.plugins.utils.XmlElementTools;
import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.IntrospectedTable;
...@@ -27,12 +27,11 @@ import org.mybatis.generator.api.dom.java.Interface; ...@@ -27,12 +27,11 @@ import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method; import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter; import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.xml.*; import org.mybatis.generator.api.dom.xml.*;
import org.mybatis.generator.codegen.mybatis3.ListUtilities;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.internal.util.StringUtility; import org.mybatis.generator.internal.util.StringUtility;
import java.util.*; import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
...@@ -77,7 +76,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -77,7 +76,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceDeleteExampleMethod(introspectedTable, method, interfaze, METHOD_DELETE_WITH_VERSION_BY_EXAMPLE); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceDeleteExampleMethod(introspectedTable, method, interfaze, METHOD_DELETE_WITH_VERSION_BY_EXAMPLE)
);
} }
return super.clientDeleteByExampleMethodGenerated(method, interfaze, introspectedTable); return super.clientDeleteByExampleMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -85,7 +87,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -85,7 +87,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceDeletePrimaryKeyMethod(introspectedTable, method, interfaze, METHOD_DELETE_WITH_VERSION_BY_PRIMARY_KEY); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceDeletePrimaryKeyMethod(introspectedTable, method, interfaze, METHOD_DELETE_WITH_VERSION_BY_PRIMARY_KEY)
);
} }
return super.clientDeleteByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable); return super.clientDeleteByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -93,7 +98,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -93,7 +98,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_SELECTIVE); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_SELECTIVE)
);
} }
return super.clientUpdateByExampleSelectiveMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByExampleSelectiveMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -101,7 +109,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -101,7 +109,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITH_BLOBS); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITH_BLOBS)
);
} }
return super.clientUpdateByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByExampleWithBLOBsMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -109,7 +120,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -109,7 +120,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITHOUT_BLOBS); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdateExampleMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITHOUT_BLOBS)
);
} }
return super.clientUpdateByExampleWithoutBLOBsMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByExampleWithoutBLOBsMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -117,7 +131,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -117,7 +131,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_SELECTIVE); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_SELECTIVE)
);
} }
return super.clientUpdateByPrimaryKeySelectiveMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByPrimaryKeySelectiveMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -125,7 +142,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -125,7 +142,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITH_BLOBS); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITH_BLOBS)
);
} }
return super.clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -133,7 +153,10 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -133,7 +153,10 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { public boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITHOUT_BLOBS); FormatTools.addMethodWithBestPosition(
interfaze,
this.replaceUpdatePrimaryKeyXmlMethod(introspectedTable, method, interfaze, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITHOUT_BLOBS)
);
} }
return super.clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(method, interfaze, introspectedTable); return super.clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(method, interfaze, introspectedTable);
} }
...@@ -143,7 +166,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -143,7 +166,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceExampleXmlElement(introspectedTable, element, METHOD_DELETE_WITH_VERSION_BY_EXAMPLE); this.sqlMaps.get(introspectedTable).add(
this.replaceExampleXmlElement(introspectedTable, element, METHOD_DELETE_WITH_VERSION_BY_EXAMPLE)
);
} }
return super.sqlMapDeleteByExampleElementGenerated(element, introspectedTable); return super.sqlMapDeleteByExampleElementGenerated(element, introspectedTable);
} }
...@@ -157,7 +182,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -157,7 +182,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replacePrimaryKeyXmlElement(introspectedTable, element, METHOD_DELETE_WITH_VERSION_BY_PRIMARY_KEY, false); this.sqlMaps.get(introspectedTable).add(
this.replacePrimaryKeyXmlElement(introspectedTable, element, METHOD_DELETE_WITH_VERSION_BY_PRIMARY_KEY, false)
);
} }
return super.sqlMapDeleteByPrimaryKeyElementGenerated(element, introspectedTable); return super.sqlMapDeleteByPrimaryKeyElementGenerated(element, introspectedTable);
} }
...@@ -165,7 +192,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -165,7 +192,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceExampleXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_SELECTIVE); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getAllColumns()),
METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_SELECTIVE,
true,
true
)
);
} }
return super.sqlMapUpdateByExampleSelectiveElementGenerated(element, introspectedTable); return super.sqlMapUpdateByExampleSelectiveElementGenerated(element, introspectedTable);
} }
...@@ -173,7 +208,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -173,7 +208,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceExampleXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITH_BLOBS); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getAllColumns()),
METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITH_BLOBS,
false,
true
)
);
} }
return super.sqlMapUpdateByExampleWithBLOBsElementGenerated(element, introspectedTable); return super.sqlMapUpdateByExampleWithBLOBsElementGenerated(element, introspectedTable);
} }
...@@ -181,7 +224,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -181,7 +224,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceExampleXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITHOUT_BLOBS); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getNonBLOBColumns()),
METHOD_UPDATE_WITH_VERSION_BY_EXAMPLE_WITHOUT_BLOBS,
false,
true
)
);
} }
return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable); return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
} }
...@@ -189,7 +240,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -189,7 +240,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateByPrimaryKeyXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_SELECTIVE); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getNonPrimaryKeyColumns()),
METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_SELECTIVE,
true,
false
)
);
} }
return super.sqlMapUpdateByPrimaryKeySelectiveElementGenerated(element, introspectedTable); return super.sqlMapUpdateByPrimaryKeySelectiveElementGenerated(element, introspectedTable);
} }
...@@ -197,7 +256,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -197,7 +256,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateByPrimaryKeyXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITH_BLOBS); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getNonPrimaryKeyColumns()),
METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITH_BLOBS,
false,
false
)
);
} }
return super.sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(element, introspectedTable); return super.sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(element, introspectedTable);
} }
...@@ -205,7 +272,15 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -205,7 +272,15 @@ public class OptimisticLockerPlugin extends BasePlugin {
@Override @Override
public boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { public boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
if (this.versionColumn != null) { if (this.versionColumn != null) {
this.replaceUpdateByPrimaryKeyXmlElement(introspectedTable, element, METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITHOUT_BLOBS); this.sqlMaps.get(introspectedTable).add(
this.generateSqlMapUpdate(
introspectedTable,
ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getBaseColumns()),
METHOD_UPDATE_WITH_VERSION_BY_PRIMARY_KEY_WITHOUT_BLOBS,
false,
false
)
);
} }
return super.sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(element, introspectedTable); return super.sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(element, introspectedTable);
} }
...@@ -282,8 +357,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -282,8 +357,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param method * @param method
* @param interfaze * @param interfaze
* @param methodName * @param methodName
* @return
*/ */
private void replaceUpdateExampleMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) { private Method replaceUpdateExampleMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) {
Method withVersionMethod = new Method(method); Method withVersionMethod = new Method(method);
// 替换方法名 // 替换方法名
...@@ -294,7 +370,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -294,7 +370,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
withVersionMethod.addParameter(0, versionParam); withVersionMethod.addParameter(0, versionParam);
FormatTools.addMethodWithBestPosition(interfaze, withVersionMethod); return withVersionMethod;
} }
/** /**
...@@ -303,8 +379,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -303,8 +379,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param method * @param method
* @param interfaze * @param interfaze
* @param methodName * @param methodName
* @return
*/ */
private void replaceDeleteExampleMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) { private Method replaceDeleteExampleMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) {
Method withVersionMethod = new Method(method); Method withVersionMethod = new Method(method);
// 替换方法名 // 替换方法名
...@@ -318,7 +395,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -318,7 +395,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
withVersionMethod.addParameter(versionParam); withVersionMethod.addParameter(versionParam);
withVersionMethod.addParameter(exampleParam); withVersionMethod.addParameter(exampleParam);
FormatTools.addMethodWithBestPosition(interfaze, withVersionMethod); return withVersionMethod;
} }
/** /**
...@@ -327,8 +404,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -327,8 +404,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param method * @param method
* @param interfaze * @param interfaze
* @param methodName * @param methodName
* @return
*/ */
private void replaceUpdatePrimaryKeyXmlMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) { private Method replaceUpdatePrimaryKeyXmlMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) {
Method withVersionMethod = new Method(method); Method withVersionMethod = new Method(method);
// 替换方法名 // 替换方法名
...@@ -342,7 +420,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -342,7 +420,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
withVersionMethod.addParameter(versionParam); withVersionMethod.addParameter(versionParam);
withVersionMethod.addParameter(recordParam); withVersionMethod.addParameter(recordParam);
FormatTools.addMethodWithBestPosition(interfaze, withVersionMethod); return withVersionMethod;
} }
/** /**
...@@ -351,8 +429,9 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -351,8 +429,9 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param method * @param method
* @param interfaze * @param interfaze
* @param methodName * @param methodName
* @return
*/ */
private void replaceDeletePrimaryKeyMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) { private Method replaceDeletePrimaryKeyMethod(IntrospectedTable introspectedTable, Method method, Interface interfaze, String methodName) {
Method withVersionMethod = new Method(method); Method withVersionMethod = new Method(method);
// 替换方法名 // 替换方法名
...@@ -366,36 +445,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -366,36 +445,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
withVersionMethod.addParameter(versionParam); withVersionMethod.addParameter(versionParam);
withVersionMethod.addParameter(keyParam); withVersionMethod.addParameter(keyParam);
FormatTools.addMethodWithBestPosition(interfaze, withVersionMethod); return withVersionMethod;
}
/**
* updateByPrimaryKeyXXXXX 因为替换了传入参数,使用注解record来赋值
* @param introspectedTable
* @param element
* @param id
* @return
*/
private XmlElement replaceUpdateByPrimaryKeyXmlElement(IntrospectedTable introspectedTable, XmlElement element, String id) {
XmlElement withVersionEle = XmlElementTools.clone(element);
// 查找所有文本节点,替换set操作text xml 节点
for (TextElement textElement : XmlElementTools.findAllTextElements(withVersionEle)) {
if (textElement.getContent().matches(".*#\\{\\w+,.*}.*")) {
Matcher matcher = Pattern.compile("(.*#\\{)(\\w+,.*}.*)").matcher(textElement.getContent());
if (matcher.find()) {
String context = matcher.group(1) + "record." + matcher.group(2);
try {
BeanUtils.setProperty(textElement, "content", context);
} catch (Exception e) {
warnings.add("Java反射失败!");
}
}
}
}
return replacePrimaryKeyXmlElement(introspectedTable, withVersionEle, id, true);
} }
/** /**
...@@ -403,6 +453,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -403,6 +453,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param introspectedTable * @param introspectedTable
* @param element * @param element
* @param id * @param id
* @return
*/ */
private XmlElement replaceExampleXmlElement(IntrospectedTable introspectedTable, XmlElement element, String id) { private XmlElement replaceExampleXmlElement(IntrospectedTable introspectedTable, XmlElement element, String id) {
XmlElement withVersionEle = XmlElementTools.clone(element); XmlElement withVersionEle = XmlElementTools.clone(element);
...@@ -423,8 +474,6 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -423,8 +474,6 @@ public class OptimisticLockerPlugin extends BasePlugin {
} }
} }
this.sqlMaps.get(introspectedTable).add(withVersionEle);
return withVersionEle; return withVersionEle;
} }
...@@ -434,6 +483,7 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -434,6 +483,7 @@ public class OptimisticLockerPlugin extends BasePlugin {
* @param element * @param element
* @param id * @param id
* @param update * @param update
* @return
*/ */
private XmlElement replacePrimaryKeyXmlElement(IntrospectedTable introspectedTable, XmlElement element, String id, boolean update) { private XmlElement replacePrimaryKeyXmlElement(IntrospectedTable introspectedTable, XmlElement element, String id, boolean update) {
XmlElement withVersionEle = XmlElementTools.clone(element); XmlElement withVersionEle = XmlElementTools.clone(element);
...@@ -488,8 +538,78 @@ public class OptimisticLockerPlugin extends BasePlugin { ...@@ -488,8 +538,78 @@ public class OptimisticLockerPlugin extends BasePlugin {
} }
} }
this.sqlMaps.get(introspectedTable).add(withVersionEle);
return withVersionEle; return withVersionEle;
} }
/**
* 生成update sql map
* @param introspectedTable
* @param columns
* @param id
* @param selective
* @param byExample
* @return
*/
private XmlElement generateSqlMapUpdate(IntrospectedTable introspectedTable, List<IntrospectedColumn> columns, String id, boolean selective, boolean byExample) {
// 移除版本列
Iterator<IntrospectedColumn> columnIterator = columns.iterator();
while (columnIterator.hasNext()) {
IntrospectedColumn introspectedColumn = columnIterator.next();
if (introspectedColumn.getActualColumnName().equals(this.versionColumn.getActualColumnName())) {
columnIterator.remove();
}
}
XmlElement updateEle = new XmlElement("update");
updateEle.addAttribute(new Attribute("id", id));
updateEle.addAttribute(new Attribute("parameterType", "map"));
commentGenerator.addComment(updateEle);
updateEle.addElement(new TextElement("update " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
if (selective) {
XmlElement setEle = new XmlElement("set");
updateEle.addElement(setEle);
// 版本自增
setEle.addElement(new TextElement(
MyBatis3FormattingUtilities.getEscapedColumnName(this.versionColumn)
+ " = "
+ MyBatis3FormattingUtilities.getEscapedColumnName(this.versionColumn)
+ " + 1,"
));
// set 节点
setEle.addElement(XmlElementGeneratorTools.generateSetsSelective(columns, "record."));
} else {
// 版本自增
updateEle.addElement(new TextElement(
"set "
+ MyBatis3FormattingUtilities.getEscapedColumnName(this.versionColumn)
+ " = "
+ MyBatis3FormattingUtilities.getEscapedColumnName(this.versionColumn)
+ " + 1,"
));
// set 节点
List<Element> setsEles = XmlElementGeneratorTools.generateSets(columns, "record.");
// XmlElementGeneratorTools.generateSets, 因为传入参数不可能带IdentityAndGeneratedAlwaysColumn所以返回的是set列表而不可能是trim 元素
for (Element ele : setsEles) {
updateEle.addElement(ele);
}
}
// 更新条件
if (byExample) {
XmlElement ifElement = new XmlElement("if");
ifElement.addAttribute(new Attribute("test", "_parameter != null"));
XmlElement includeElement = new XmlElement("include");
includeElement.addAttribute(new Attribute("refid", SQL_UPDATE_BY_EXAMPLE_WITH_VERSION_WHERE_CLAUSE));
ifElement.addElement(includeElement);
updateEle.addElement(ifElement);
} else {
this.replacePrimaryKeyXmlElement(introspectedTable, updateEle, id, true);
}
return updateEle;
}
} }
...@@ -50,33 +50,27 @@ public class XmlElementGeneratorTools { ...@@ -50,33 +50,27 @@ public class XmlElementGeneratorTools {
* @return the selectKey element * @return the selectKey element
*/ */
public static Element getSelectKey(IntrospectedColumn introspectedColumn, GeneratedKey generatedKey) { public static Element getSelectKey(IntrospectedColumn introspectedColumn, GeneratedKey generatedKey) {
String identityColumnType = introspectedColumn String identityColumnType = introspectedColumn.getFullyQualifiedJavaType().getFullyQualifiedName();
.getFullyQualifiedJavaType().getFullyQualifiedName();
XmlElement answer = new XmlElement("selectKey"); XmlElement answer = new XmlElement("selectKey");
answer.addAttribute(new Attribute("resultType", identityColumnType)); answer.addAttribute(new Attribute("resultType", identityColumnType));
answer.addAttribute(new Attribute( answer.addAttribute(new Attribute("keyProperty", introspectedColumn.getJavaProperty()));
"keyProperty", introspectedColumn.getJavaProperty())); answer.addAttribute(new Attribute("order", generatedKey.getMyBatis3Order()));
answer.addAttribute(new Attribute("order",
generatedKey.getMyBatis3Order()));
answer.addElement(new TextElement(generatedKey answer.addElement(new TextElement(generatedKey.getRuntimeSqlStatement()));
.getRuntimeSqlStatement()));
return answer; return answer;
} }
public static Element getBaseColumnListElement(IntrospectedTable introspectedTable) { public static Element getBaseColumnListElement(IntrospectedTable introspectedTable) {
XmlElement answer = new XmlElement("include"); XmlElement answer = new XmlElement("include");
answer.addAttribute(new Attribute("refid", answer.addAttribute(new Attribute("refid", introspectedTable.getBaseColumnListId()));
introspectedTable.getBaseColumnListId()));
return answer; return answer;
} }
public static Element getBlobColumnListElement(IntrospectedTable introspectedTable) { public static Element getBlobColumnListElement(IntrospectedTable introspectedTable) {
XmlElement answer = new XmlElement("include"); XmlElement answer = new XmlElement("include");
answer.addAttribute(new Attribute("refid", answer.addAttribute(new Attribute("refid", introspectedTable.getBlobColumnListId()));
introspectedTable.getBlobColumnListId()));
return answer; return answer;
} }
...@@ -85,8 +79,7 @@ public class XmlElementGeneratorTools { ...@@ -85,8 +79,7 @@ public class XmlElementGeneratorTools {
ifElement.addAttribute(new Attribute("test", "_parameter != null")); ifElement.addAttribute(new Attribute("test", "_parameter != null"));
XmlElement includeElement = new XmlElement("include"); XmlElement includeElement = new XmlElement("include");
includeElement.addAttribute(new Attribute("refid", includeElement.addAttribute(new Attribute("refid", introspectedTable.getExampleWhereClauseId()));
introspectedTable.getExampleWhereClauseId()));
ifElement.addElement(includeElement); ifElement.addElement(includeElement);
return ifElement; return ifElement;
...@@ -97,8 +90,7 @@ public class XmlElementGeneratorTools { ...@@ -97,8 +90,7 @@ public class XmlElementGeneratorTools {
ifElement.addAttribute(new Attribute("test", "_parameter != null")); ifElement.addAttribute(new Attribute("test", "_parameter != null"));
XmlElement includeElement = new XmlElement("include"); XmlElement includeElement = new XmlElement("include");
includeElement.addAttribute(new Attribute("refid", includeElement.addAttribute(new Attribute("refid", introspectedTable.getMyBatis3UpdateByExampleWhereClauseId()));
introspectedTable.getMyBatis3UpdateByExampleWhereClauseId()));
ifElement.addElement(includeElement); ifElement.addElement(includeElement);
return ifElement; return ifElement;
...@@ -270,18 +262,7 @@ public class XmlElementGeneratorTools { ...@@ -270,18 +262,7 @@ public class XmlElementGeneratorTools {
* @return * @return
*/ */
public static List<Element> generateSets(List<IntrospectedColumn> columns, String prefix) { public static List<Element> generateSets(List<IntrospectedColumn> columns, String prefix) {
return generateSets(columns, prefix, false); return generateCommColumns(columns, prefix, false, 3);
}
/**
* 生成sets Ele
* @param columns
* @param prefix
* @param bracket
* @return
*/
public static List<Element> generateSets(List<IntrospectedColumn> columns, String prefix, boolean bracket) {
return generateCommColumns(columns, prefix, bracket, 3);
} }
/** /**
...@@ -290,7 +271,7 @@ public class XmlElementGeneratorTools { ...@@ -290,7 +271,7 @@ public class XmlElementGeneratorTools {
* @return * @return
*/ */
public static XmlElement generateSetsSelective(List<IntrospectedColumn> columns) { public static XmlElement generateSetsSelective(List<IntrospectedColumn> columns) {
return generateSetsSelective(columns, null, false); return generateSetsSelective(columns, null);
} }
/** /**
...@@ -300,18 +281,7 @@ public class XmlElementGeneratorTools { ...@@ -300,18 +281,7 @@ public class XmlElementGeneratorTools {
* @return * @return
*/ */
public static XmlElement generateSetsSelective(List<IntrospectedColumn> columns, String prefix) { public static XmlElement generateSetsSelective(List<IntrospectedColumn> columns, String prefix) {
return generateSetsSelective(columns, prefix, false); return generateCommColumnsSelective(columns, prefix, false, 3);
}
/**
* 生成sets Selective Ele
* @param columns
* @param prefix
* @param bracket
* @return
*/
public static XmlElement generateSetsSelective(List<IntrospectedColumn> columns, String prefix, boolean bracket) {
return generateCommColumnsSelective(columns, prefix, bracket, 3);
} }
/** /**
...@@ -325,6 +295,7 @@ public class XmlElementGeneratorTools { ...@@ -325,6 +295,7 @@ public class XmlElementGeneratorTools {
private 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<>();
// 只有upsert插件才会传入 IdentityAndGeneratedAlwaysColumn
if (hasIdentityAndGeneratedAlwaysColumns(columns)) { if (hasIdentityAndGeneratedAlwaysColumns(columns)) {
XmlElement trimEle = generateTrim(bracket); XmlElement trimEle = generateTrim(bracket);
......
...@@ -47,8 +47,28 @@ public class OptimisticLockerPluginTest { ...@@ -47,8 +47,28 @@ public class OptimisticLockerPluginTest {
*/ */
@Test @Test
public void testUpdateWithVersionByExampleSelective() throws Exception { public void testUpdateWithVersionByExampleSelective() throws Exception {
// 测试不带or的更新
MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/OptimisticLockerPlugin/mybatis-generator.xml"); MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/OptimisticLockerPlugin/mybatis-generator.xml");
tool.generate(new AbstractShellCallback() { tool.generate(() -> DBHelper.createDB("scripts/OptimisticLockerPlugin/init.sql"), 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);
ObjectUtil tb = new ObjectUtil(loader, packagz + ".Tb");
tb.set("incF2", 10L);
tb.set("incF3", 5L);
// sql
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "updateWithVersionByExample", 1L, tb.getObject(), tbExample.getObject());
Assert.assertEquals(sql, "update tb SET field_1 = 'null' , inc_f2 = 5 WHERE ( id = '1' )");
}
});
tool.generate(() -> DBHelper.createDB("scripts/OptimisticLockerPlugin/init.sql"), new AbstractShellCallback() {
@Override @Override
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper"))); ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));
......
...@@ -20,7 +20,7 @@ SET FOREIGN_KEY_CHECKS=0; ...@@ -20,7 +20,7 @@ SET FOREIGN_KEY_CHECKS=0;
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `tb`; DROP TABLE IF EXISTS `tb`;
CREATE TABLE `tb` ( CREATE TABLE `tb` (
`id` bigint(20) NOT NULL COMMENT '注释1', `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1',
`field1` varchar(255) DEFAULT NULL COMMENT '注释2', `field1` varchar(255) DEFAULT NULL COMMENT '注释2',
`inc_f1` bigint(20) NOT NULL DEFAULT '0', `inc_f1` bigint(20) NOT NULL DEFAULT '0',
`inc_f2` bigint(20) DEFAULT '0', `inc_f2` bigint(20) DEFAULT '0',
......
...@@ -53,9 +53,13 @@ ...@@ -53,9 +53,13 @@
</table> </table>
<table tableName="tb_keys"> <table tableName="tb_keys">
<property name="versionColumn" value="inc_f1"/> <property name="versionColumn" value="inc_f1"/>
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table> </table>
<table tableName="tb_blobs"> <table tableName="tb_blobs">
<property name="versionColumn" value="inc_f1"/> <property name="versionColumn" value="inc_f1"/>
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table> </table>
</context> </context>
</generatorConfiguration> </generatorConfiguration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment