package com.baomidou.mybatisplus.test.plugins.optimisticLocker;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Objects;
import java.util.Random;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.entity.DateVersionUser;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.entity.IntVersionUser;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.entity.LongVersionUser;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.entity.StringVersionUser;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.entity.TimestampVersionUser;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.mapper.DateVersionUserMapper;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.mapper.IntVersionUserMapper;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.mapper.LongVersionUserMapper;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.mapper.StringVersionUserMapper;
import com.baomidou.mybatisplus.test.plugins.optimisticLocker.mapper.TimestampVersionUserMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/plugins/optimisticLockerInterceptor.xml" })
public class OptimisticLockerInterceptorTest {
@Autowired
private IntVersionUserMapper intVersionUserMapper;
@Autowired
private LongVersionUserMapper longVersionUserMapper;
@Autowired
private DateVersionUserMapper dateVersionUserMapper;
@Autowired
private TimestampVersionUserMapper timestampVersionUserMapper;
@Autowired
private StringVersionUserMapper stringersionUserMapper;
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
@Before
public void setUp() throws Exception {
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession();
Connection conn = session.getConnection();
Reader reader = Resources
.getResourceAsReader("com/baomidou/mybatisplus/test/plugins/optimisticLocker/CreateDB.sql");
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(null);
runner.runScript(reader);
reader.close();
session.close();
}
@Test
public void intVersionTest() {
// 查询数据
IntVersionUser versionUser = intVersionUserMapper.selectById(1);
Integer originVersion = versionUser.getVersion();
// 更新数据
versionUser.setName("苗神");
intVersionUserMapper.updateById(versionUser);
Assert.assertTrue(intVersionUserMapper.selectById(1).getVersion() == originVersion + 1);
// 重复测试一次,验证动态参数覆盖
// 查询数据
IntVersionUser versionUser2 = intVersionUserMapper.selectById(2);
Integer originVersion2 = versionUser2.getVersion();
versionUser2.setAge(16);
// 更新数据
versionUser2.setName("苗神");
intVersionUserMapper.updateById(versionUser2);
Assert.assertTrue(intVersionUserMapper.selectById(2).getVersion() == originVersion2 + 1);
// 测试一次数据库中version为null
IntVersionUser versionUser3 = intVersionUserMapper.selectById(3);
// 更新数据
versionUser3.setName("苗神");
intVersionUserMapper.updateById(versionUser3);
Assert.assertTrue(intVersionUserMapper.selectById(3).getVersion() == null);
}
@Test
public void longVersionTest() {
// 查询数据
LongVersionUser versionUser = longVersionUserMapper.selectById(1);
Long originVersion = versionUser.getVersion();
// 更新数据
versionUser.setName("苗神");
longVersionUserMapper.updateById(versionUser);
Assert.assertTrue(longVersionUserMapper.selectById(1).getVersion() == originVersion + 1);
}
@Test
public void dateVersionTest() {
// 插入数据
DateVersionUser versionUser = new DateVersionUser();
versionUser.setId(15L);
versionUser.setName("苗神");
Date originVersion = new Date();
versionUser.setVersion(originVersion);
dateVersionUserMapper.insert(versionUser);
// 更新数据
DateVersionUser q = dateVersionUserMapper.selectById(15);
q.setName("小锅盖");
dateVersionUserMapper.updateById(q);
Assert.assertTrue(dateVersionUserMapper.selectById(15L).getVersion().after(originVersion));
}
@Test
public void timestampVersionTest() {
// 插入数据
TimestampVersionUser versionUser = new TimestampVersionUser();
versionUser.setId(15L);
versionUser.setName("苗神");
Timestamp originVersion = new Timestamp(new Date().getTime());
versionUser.setVersion(originVersion);
timestampVersionUserMapper.insert(versionUser);
// 更新数据
TimestampVersionUser q = timestampVersionUserMapper.selectById(15);
q.setName("小锅盖");
timestampVersionUserMapper.updateById(q);
Assert.assertTrue(timestampVersionUserMapper.selectById(15L).getVersion().after(originVersion));
}
@Test
public void stringVersionTest() {
// 查询数据
StringVersionUser versionUser = stringersionUserMapper.selectById(1);
String originVersion = versionUser.getTt();
// 更新数据
versionUser.setName("苗神");
stringersionUserMapper.updateById(versionUser);
Assert.assertEquals(stringersionUserMapper.selectById(1).getTt(),
String.valueOf(Long.parseLong(originVersion) + 1));
}
@Test
public void multiThreadVersionTest() {
final Random random = new Random();
for (int i = 50; i < 150; i++) {
new Thread(new Runnable() {
public void run() {
IntVersionUser intVersionUser = new IntVersionUser();
long id = random.nextLong();
intVersionUser.setId(id);
int version = random.nextInt();
intVersionUser.setName("改前" + version);
intVersionUser.setVersion(version);
intVersionUserMapper.insert(intVersionUser);
intVersionUser.setName("改后" + version);
intVersionUserMapper.updateById(intVersionUser);
Assert.assertTrue(intVersionUserMapper.selectById(id).getVersion() == version + 1);
}
}, "编号" + i).start();
}
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void multiParamVersionTest() {
// 查询数据
IntVersionUser versionUser = intVersionUserMapper.selectById(2);
Integer originVersion = versionUser.getVersion();
// null条件
intVersionUserMapper.update(versionUser, null);
Assert.assertTrue(Objects.equals(intVersionUserMapper.selectById(2).getVersion(), originVersion));
// 空条件
intVersionUserMapper.update(versionUser, new EntityWrapper<IntVersionUser>());
Assert.assertTrue(Objects.equals(intVersionUserMapper.selectById(2).getVersion(), originVersion));
// 正常查询不带version
IntVersionUser wrapper = new IntVersionUser();
wrapper.setName("lisi");
intVersionUserMapper.update(versionUser, new EntityWrapper<>(wrapper));
Assert.assertTrue(intVersionUserMapper.selectById(2).getVersion() == originVersion + 1);
// 原始条件带version按原始逻辑走
IntVersionUser wrapper2 = new IntVersionUser();
wrapper2.setName("lisi");
wrapper2.setVersion(originVersion + 1);
intVersionUserMapper.update(versionUser, new EntityWrapper<>(wrapper2));
Assert.assertTrue(intVersionUserMapper.selectById(1).getVersion() == originVersion + 1);
}
}