Commit 8922abde authored by hewei's avatar hewei

乐观锁配合逻辑删除插件使用,测试用例补充

parent 9724ff57
......@@ -100,14 +100,12 @@ public class LogicalDeletePlugin extends BasePlugin {
|| JDBCType.BIT == type
|| JDBCType.BOOLEAN == type
|| JDBCType.CHAR == type
|| JDBCType.DECIMAL == type
|| JDBCType.DOUBLE == type
|| JDBCType.FLOAT == type
|| JDBCType.INTEGER == type
|| JDBCType.LONGNVARCHAR == type
|| JDBCType.LONGVARCHAR == type
|| JDBCType.NCHAR == type
|| JDBCType.NUMERIC == type
|| JDBCType.NVARCHAR == type
|| JDBCType.SMALLINT == type
|| JDBCType.TINYINT == type
......@@ -271,24 +269,7 @@ public class LogicalDeletePlugin extends BasePlugin {
// 更新逻辑删除字段
sb.append(this.logicalDeleteColumn.getActualColumnName());
sb.append(" = ");
// 判断字段类型
JDBCType type = JDBCType.valueOf(this.logicalDeleteColumn.getJdbcType());
if (this.logicalDeleteValue == null || "NULL".equalsIgnoreCase(this.logicalDeleteValue)) {
sb.append("NULL");
} else if (JDBCType.CHAR == type
|| JDBCType.LONGNVARCHAR == type
|| JDBCType.LONGVARCHAR == type
|| JDBCType.NCHAR == type
|| JDBCType.NVARCHAR == type
|| JDBCType.VARCHAR == type
|| JDBCType.BIGINT == type) {
sb.append("'");
sb.append(this.logicalDeleteValue);
sb.append("'");
} else {
sb.append(this.logicalDeleteValue);
}
sb.append(XmlElementGeneratorTools.generateLogicalDeleteColumnValue(this.logicalDeleteColumn, this.logicalDeleteValue));
logicalDeleteByExample.addElement(new TextElement(sb.toString()));
......@@ -325,24 +306,7 @@ public class LogicalDeletePlugin extends BasePlugin {
// 更新逻辑删除字段
sb1.append(this.logicalDeleteColumn.getActualColumnName());
sb1.append(" = ");
// 判断字段类型
JDBCType type1 = JDBCType.valueOf(this.logicalDeleteColumn.getJdbcType());
if (this.logicalDeleteValue == null || "NULL".equalsIgnoreCase(this.logicalDeleteValue)) {
sb1.append("NULL");
} else if (JDBCType.CHAR == type1
|| JDBCType.LONGNVARCHAR == type1
|| JDBCType.LONGVARCHAR == type1
|| JDBCType.NCHAR == type1
|| JDBCType.NVARCHAR == type1
|| JDBCType.VARCHAR == type1
|| JDBCType.BIGINT == type1) {
sb1.append("'");
sb1.append(this.logicalDeleteValue);
sb1.append("'");
} else {
sb1.append(this.logicalDeleteValue);
}
sb1.append(XmlElementGeneratorTools.generateLogicalDeleteColumnValue(this.logicalDeleteColumn, this.logicalDeleteValue));
logicalDeleteByPrimaryKey.addElement(new TextElement(sb1.toString()));
......@@ -401,10 +365,10 @@ public class LogicalDeletePlugin extends BasePlugin {
XmlElement chooseEle = new XmlElement("choose");
XmlElement whenEle = new XmlElement("when");
whenEle.addAttribute(new Attribute("test", PARAMETER_LOGICAL_DELETED));
whenEle.addElement(new TextElement("'" + this.logicalDeleteValue + "'"));
whenEle.addElement(new TextElement(XmlElementGeneratorTools.generateLogicalDeleteColumnValue(this.logicalDeleteColumn, this.logicalDeleteValue)));
chooseEle.addElement(whenEle);
XmlElement otherwiseEle = new XmlElement("otherwise");
otherwiseEle.addElement(new TextElement("'" + this.logicalUnDeleteValue + "'"));
otherwiseEle.addElement(new TextElement(XmlElementGeneratorTools.generateLogicalDeleteColumnValue(this.logicalDeleteColumn, this.logicalUnDeleteValue)));
chooseEle.addElement(otherwiseEle);
selectByPrimaryKey.addElement(chooseEle);
......
......@@ -29,7 +29,6 @@ import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.internal.util.JavaBeansUtil;
import org.mybatis.generator.internal.util.StringUtility;
import java.sql.JDBCType;
import java.util.*;
/**
......@@ -822,23 +821,7 @@ public class OptimisticLockerPlugin extends BasePlugin implements IModelBuilderP
// 逻辑删除 set
sb.append(logicalDeleteColumn.getActualColumnName());
sb.append(" = ");
// 判断字段类型
JDBCType type = JDBCType.valueOf(logicalDeleteColumn.getJdbcType());
if (logicalDeleteValue == null || "NULL".equalsIgnoreCase(logicalDeleteValue)) {
sb.append("NULL");
} else if (JDBCType.CHAR == type
|| JDBCType.LONGNVARCHAR == type
|| JDBCType.LONGVARCHAR == type
|| JDBCType.NCHAR == type
|| JDBCType.NVARCHAR == type
|| JDBCType.VARCHAR == type
|| JDBCType.BIGINT == type) {
sb.append("'");
sb.append(logicalDeleteValue);
sb.append("'");
} else {
sb.append(logicalDeleteValue);
}
sb.append(XmlElementGeneratorTools.generateLogicalDeleteColumnValue(logicalDeleteColumn, logicalDeleteValue));
updateEle.addElement(new TextElement(sb.toString()));
// 更新条件
......
......@@ -557,4 +557,29 @@ public class XmlElementGeneratorTools {
}
return resultElement;
}
/**
* 生成逻辑删除列的删除值
* @param logicalDeleteColumn
* @param value
* @return
*/
public static String generateLogicalDeleteColumnValue(IntrospectedColumn logicalDeleteColumn, String value) {
StringBuilder sb = new StringBuilder();
// 判断字段类型
if (value == null || "NULL".equalsIgnoreCase(value)) {
sb.append("NULL");
} else if (logicalDeleteColumn.isStringColumn()) {
sb.append("'");
sb.append(value);
sb.append("'");
} else if (logicalDeleteColumn.getFullyQualifiedJavaType().getFullyQualifiedName().equals(Long.class.getName())){
sb.append(value.replaceAll("L|l", ""));
} else if (logicalDeleteColumn.getFullyQualifiedJavaType().getFullyQualifiedName().equals(Float.class.getName())){
sb.append(value.replaceAll("F|f", ""));
} else {
sb.append(value);
}
return sb.toString();
}
}
......@@ -344,6 +344,7 @@ public class OptimisticLockerPluginTest {
tool.generate(() -> DBHelper.resetDB("scripts/OptimisticLockerPlugin/init.sql"), new AbstractShellCallback() {
@Override
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
// ---------------------------------------- logicalDeleteWithVersionByExample ---------------------------------------
ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper")));
ObjectUtil tbExample = new ObjectUtil(loader, packagz + ".TbExample");
......@@ -352,7 +353,7 @@ public class OptimisticLockerPluginTest {
// 验证sql
String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_EXAMPLE, 0L, tbExample.getObject());
Assert.assertEquals(sql, "update tb set inc_f1 = inc_f1 + 1,inc_f2 = '9L' WHERE inc_f1 = 0 and ( ( id = '1' ) )");
Assert.assertEquals(sql, "update tb set inc_f1 = inc_f1 + 1,inc_f2 = 9 WHERE inc_f1 = 0 and ( ( id = '1' ) )");
// 验证执行
Object result = tbMapper.invoke(OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_EXAMPLE, 0L, tbExample.getObject());
Assert.assertEquals(result, 1);
......@@ -360,15 +361,71 @@ public class OptimisticLockerPluginTest {
rs.first();
Assert.assertEquals(rs.getInt("inc_f1"), 1);
Assert.assertEquals(rs.getInt("inc_f2"), 9);
// ---------------------------------------- logicalDeleteWithVersionByPrimaryKey ---------------------------------------
// 验证sql
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 1L, 2L);
Assert.assertEquals(sql, "update tb set inc_f1 = inc_f1 + 1,inc_f2 = 9 where inc_f1 = 1 and id = 2");
// 验证执行
result = tbMapper.invoke(OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 1L, 2L);
Assert.assertEquals(result, 1);
rs = DBHelper.execute(sqlSession.getConnection(), "select * from tb where id = 2");
rs.first();
Assert.assertEquals(rs.getInt("inc_f1"), 2);
Assert.assertEquals(rs.getInt("inc_f2"), 9);
}
});
// 自定义nextVersion
tool = MyBatisGeneratorTool.create("scripts/OptimisticLockerPlugin/mybatis-generator-with-LogicalDeletePlugin-customizedNextVersion.xml");
tool.generate(() -> DBHelper.resetDB("scripts/OptimisticLockerPlugin/init.sql"), new AbstractShellCallback() {
@Override
public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception {
// ---------------------------------------- logicalDeleteWithVersionByExample ---------------------------------------
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(), OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_EXAMPLE, 0L, 100L, tbExample.getObject());
Assert.assertEquals(sql, "update tb set inc_f1 = 100,inc_f2 = 9 WHERE inc_f1 = 0 and ( ( id = '1' ) )");
// 验证执行
Object result = tbMapper.invoke(OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_EXAMPLE, 0L, 100L, tbExample.getObject());
Assert.assertEquals(result, 1);
ResultSet rs = DBHelper.execute(sqlSession.getConnection(), "select * from tb where id = 1");
rs.first();
Assert.assertEquals(rs.getInt("inc_f1"), 100);
Assert.assertEquals(rs.getInt("inc_f2"), 9);
// ---------------------------------------- logicalDeleteWithVersionByPrimaryKey ---------------------------------------
// 验证sql
sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 1L, 200L, 2L);
Assert.assertEquals(sql, "update tb set inc_f1 = 200,inc_f2 = 9 where inc_f1 = 1 and id = 2");
// 验证执行
result = tbMapper.invoke(OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 1L, 200L, 2L);
Assert.assertEquals(result, 1);
rs = DBHelper.execute(sqlSession.getConnection(), "select * from tb where id = 2");
rs.first();
Assert.assertEquals(rs.getInt("inc_f1"), 200);
Assert.assertEquals(rs.getInt("inc_f2"), 9);
// ------------------------------------ Key -----------------------------------
ObjectUtil tbKeysMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbKeysMapper")));
ObjectUtil tbKeysKey = new ObjectUtil(loader, packagz + ".TbKeysKey");
tbKeysKey.set("key1", 2L);
tbKeysKey.set("key2", "k2");
sql = SqlHelper.getFormatMapperSql(tbKeysMapper.getObject(), OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 3L, 200L, tbKeysKey.getObject());
Assert.assertEquals(sql, "update tb_keys set inc_f1 = 200,inc_f2 = 9 where inc_f1 = 3 and key1 = 2 and key2 = 'k2'");
// 验证执行
result = tbKeysMapper.invoke(OptimisticLockerPlugin.METHOD_LOGICAL_DELETE_WITH_VERSION_BY_PRIMARY_KEY, 3L, 200L, tbKeysKey.getObject());
Assert.assertEquals(result, 1);
rs = DBHelper.execute(sqlSession.getConnection(), "select * from tb_keys where key1 = 2 and key2 = 'k2'");
rs.first();
Assert.assertEquals(rs.getInt("inc_f1"), 200);
Assert.assertEquals(rs.getInt("inc_f2"), 9);
}
});
}
......
......@@ -64,7 +64,7 @@
<table tableName="tb_keys">
<property name="versionColumn" value="inc_f1"/>
<property name="logicalDeleteColumn" value="inc_f2"/>
<property name="customizedNextVersion" value="true"/>
</table>
</context>
......
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