Bladeren bron

Add test case for Timestamp version control

yuxiaobin 8 jaren geleden
bovenliggende
commit
4c5d2280c4

+ 24 - 8
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/OptimisticLockerInterceptor.java

@@ -39,7 +39,7 @@ import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
 import net.sf.jsqlparser.expression.LongValue;
-import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.TimestampValue;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
@@ -90,7 +90,6 @@ public final class OptimisticLockerInterceptor implements Interceptor {
 		Class<? extends Object> parameterClass = parameterObject.getClass();
 		Class<?> realClass = null;
 		if (parameterObject instanceof ParamMap) {
-			//FIXME 这里还没处理
 			ParamMap<?> tt = (ParamMap<?>) parameterObject;
 			parameterClass = tt.get("param1").getClass();
 		}
@@ -191,9 +190,11 @@ public final class OptimisticLockerInterceptor implements Interceptor {
 							break;
 					}
 					versionField.set(realObject, versionNewValue);
+				} else if(visitor.isTimestampValue()){
+					TimestampValue tsVal = (TimestampValue) plusExpression;
+					versionField.set(realObject, tsVal.getValue());
 				} else {
 					// TODO: 自定义VersionHandler处理
-
 				}
 			}
 			BinaryExpression expression = (BinaryExpression) parse.getWhere();
@@ -307,36 +308,51 @@ public final class OptimisticLockerInterceptor implements Interceptor {
 		public Expression getRightExpression(Object param) {
 			Date date = (Date) param;
 			String millTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format((Date) param);
-			String realTime;
+			String realTimeStr = null;
 			Integer mills = Integer.valueOf(millTime.substring(20, 21));
 			if (mills >= 5) {
 				Calendar calendar = Calendar.getInstance();
 				calendar.setTime(date);
 				calendar.add(Calendar.SECOND, 1);
-				realTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
+				realTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
 			} else {
-				realTime = millTime.substring(0, 19);
+				realTimeStr = "'"+millTime.substring(0, 19)+"'";
 			}
-			return new StringValue(realTime);
+			return  new TimestampValue("'"+realTimeStr+"'");
 		}
 
 		public Expression getPlusExpression(Object param) {
-			return new StringValue(new Timestamp(new Date().getTime()).toString());
+			String currTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+			return  new TimestampValue("'"+currTimeStr+"'");
 		}
 
 	}
 
 	private static class VersionExpSimpleTypeVisitor extends ExpressionVisitorAdapter {
 		private boolean longValue = false;
+		private boolean timestampValue = false;
 
 		@Override
 		public void visit(LongValue value) {
 			longValue = true;
+			timestampValue = false;
+		}
+
+		@Override
+		public void visit(TimestampValue value) {
+			longValue = false;
+			timestampValue = true;
 		}
 
 		public boolean isLongValue() {
 			return longValue;
 		}
+
+		public boolean isTimestampValue() {
+			return timestampValue;
+		}
+		
+		
 	}
 
 }

+ 35 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/plugin/OptimisticLockerInterceptorJUnitTest.java

@@ -1,6 +1,8 @@
 package com.baomidou.mybatisplus.test.plugin;
 
 import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Date;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -10,6 +12,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.plugin.OptimisticLocker.entity.TimeVersionUser;
 
 
 @RunWith(SpringJUnit4ClassRunner.class)
@@ -73,4 +76,36 @@ public class OptimisticLockerInterceptorJUnitTest extends UserTestBase{
 		Assert.assertEquals(3, user.getVersion().intValue());
 	}
 	
+	@Test
+	public void testTimestampVersionControl(){
+		timeVersionMapper.deleteById(1L);
+		TimeVersionUser user = new TimeVersionUser();
+		user.setId(1L);
+		user.setName("name1");
+		Calendar cal = Calendar.getInstance();
+		cal.add(Calendar.DAY_OF_MONTH, -1);
+		user.setVersion(cal.getTime());
+		timeVersionMapper.insert(user);
+		
+		cal = Calendar.getInstance();
+		cal.add(Calendar.SECOND, -1);
+		Date date = cal.getTime();
+		System.err.println("date="+date);
+		int compare = user.getVersion().compareTo(date);
+		Assert.assertTrue(compare<0);
+		
+		TimeVersionUser updateUser = new TimeVersionUser();
+		updateUser.setId(1L);
+		updateUser.setName("updname");
+		updateUser.setVersion(user.getVersion());
+		
+		timeVersionMapper.updateById(updateUser);
+		user = timeVersionMapper.selectById(1L);
+		Date version = user.getVersion();
+		System.err.println("after update: version="+version);
+		compare = version.compareTo(date);
+		System.err.println("compare="+compare);
+		Assert.assertTrue(compare>0);
+	}
+	
 }

+ 4 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/plugin/UserTestBase.java

@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.test.mysql.entity.User;
 import com.baomidou.mybatisplus.test.mysql.service.IUserService;
+import com.baomidou.mybatisplus.test.plugin.OptimisticLocker.mapper.TimeVersionUserMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
 
 public abstract class UserTestBase {
@@ -18,6 +19,9 @@ public abstract class UserTestBase {
 	@Autowired
 	protected IUserService userService;
 	
+	@Autowired
+	protected TimeVersionUserMapper timeVersionMapper;
+	
 	@Before
 	public void init(){
 //		cleanData();

+ 2 - 2
mybatis-plus/src/test/resources/spring/spring-jdbc.xml

@@ -79,7 +79,7 @@
 		class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
 		<property name="dataSource" ref="dataSource" />
 		<property name="configLocation" value="classpath:mybatis-config.xml" />
-		<property name="typeAliasesPackage" value="com.baomidou.mybatisplus.test.mysql.entity" />
+		<property name="typeAliasesPackage" value="com.baomidou.mybatisplus.test.mysql.entity;com.baomidou.mybatisplus.test.plugin.OptimisticLocker.entity" />
 		<property name="mapperLocations" value="classpath:mysql/*Mapper.xml" />
 		<property name="globalConfig" ref="globalConfig" />
 		<property name="plugins">
@@ -103,6 +103,6 @@
 	<bean id="sqlInjector" class="com.baomidou.mybatisplus.test.mysql.MySqlInjector" />
 
 	<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-		<property name="basePackage" value="com.baomidou.mybatisplus.test.mysql.mapper" />
+		<property name="basePackage" value="com.baomidou.mybatisplus.test.mysql.mapper;com.baomidou.mybatisplus.test.plugin.OptimisticLocker.mapper" />
 	</bean>
 </beans>