MybatisPlus乐观锁
代码片段TestOneMapper.xml?xml version1.0encodingUTF-8?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.hk.mapper.TestOneMapperselect idqueryresultTypecom.hk.entity.TestOneInfoselect*from test_testone/selectselect idqueryListresultTypecom.hk.entity.TestOneInfoselect*from test_testone ${ew.customSqlSegment}/select/mapperTestOneInfo.javapackagecom.hk.entity;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importcom.baomidou.mybatisplus.annotation.Version;importcom.fasterxml.jackson.annotation.JsonFormat;importlombok.Data;importlombok.EqualsAndHashCode;importlombok.experimental.Accessors;importorg.springframework.format.annotation.DateTimeFormat;importjava.io.Serializable;importjava.util.Date;DataTableName(test_testone)publicclassTestOneInfoimplementsSerializable{TableId(typeIdType.ASSIGN_ID)privateStringidnull;privateStringnamenull;JsonFormat(timezoneGMT8,patternyyyy-MM-dd HH:mm:ss)DateTimeFormat(patternyyyy-MM-dd HH:mm:ss)privateDatecreateTimenewDate();privateStringcreateIdnull;JsonFormat(timezoneGMT8,patternyyyy-MM-dd HH:mm:ss)DateTimeFormat(patternyyyy-MM-dd HH:mm:ss)privateDateupdateTimenull;privateStringupdateIdnull;VersionprivateLongversion0L;}TestOneMapper.javapackagecom.hk.mapper;importcom.baomidou.mybatisplus.core.conditions.Wrapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.core.toolkit.Constants;importcom.hk.entity.TestOneInfo;importorg.apache.ibatis.annotations.Param;publicinterfaceTestOneMapperextendsBaseMapperTestOneInfo{publicIPageTestOneInfoqueryList(IPageTestOneInfopage,Param(Constants.WRAPPER)WrapperTestOneInfowrapper);}ITestOneService.javapackagecom.hk.service;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.service.IService;importcom.hk.entity.TestOneInfo;importcom.hk.entity.TestTwoInfo;publicinterfaceITestOneServiceextendsIServiceTestOneInfo{booleansave(TestOneInfot);TestOneInfoget(Stringid)throwsException;booleandelete(TestOneInfot)throwsException;booleandeleteById(Stringid)throwsException;/** * 操作本表并通过Service操作第二张表,代码设置除0操作检查两张表上的事务一致性 * return * throws Exception */booleantestTx1()throwsException;/** * testTx2,TestTx3分别操作表1和表2,它们同在一个Service实现类上 * 检查两张表上的事务一致性 * return * throws Exception */booleantestTx2(TestOneInfot)throwsException;booleantestTx3(TestTwoInfot)throwsException;/** * testTx4是公共方法,其中调用私有方法testTx5,两个方法分别操作两个表 * 代码抛出异常,检查两张表上的事务一致性 * param t * return * throws Exception */booleantestTx4(TestOneInfot)throwsException;/** * 根据数据库列定制Where条件,分页查询 * param pageNo 页码 * param pageSize 每页显示记录数 * param name 查询列 * param orderColumn 排序列 * param order 升序或降序,其值为CommonEnum.ASC或CommonEnum.DESC * return * throws Exception */IPageTestOneInfoqueryName(IntegerpageNo,IntegerpageSize,Stringname,StringorderColumn,Stringorder)throwsException;/** * 根据数据库列定制Where条件,分页查询Mapper中定义的方法 * param pageNo 页码 * param pageSize 每页显示记录数 * param orderColumn 排序列 * param order 升序或降序,其值为CommonEnum.ASC或CommonEnum.DESC * param queryWrapper 查询条件封装类 * return * throws Exception */IPageTestOneInfoqueryMethod(IntegerpageNo,IntegerpageSize,StringorderColumn,Stringorder,QueryWrapperTestOneInfoqueryWrapper)throwsException;}TestOneServiceImpl.javapackagecom.hk.service.impl;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.hk.entity.TestOneInfo;importcom.hk.entity.TestTwoInfo;importcom.hk.mapper.TestOneMapper;importcom.hk.service.ITestOneService;importcom.hk.service.ITestTwoService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;Slf4jServiceTransactional(readOnlyfalse,rollbackForException.class,propagationPropagation.REQUIRED)publicclassTestOneServiceImplextendsServiceImplTestOneMapper,TestOneInfoimplementsITestOneService{AutowiredprivateITestTwoServicetestTwoService;AutowiredprivateTestOneMappertestOneMapper;Overridepublicbooleansave(TestOneInfot){try{returnsuper.save(t);}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}OverridepublicTestOneInfoget(Stringid)throwsException{try{returnsuper.getById(id);}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}Overridepublicbooleandelete(TestOneInfot)throwsException{try{returnsuper.removeById(t.getId());}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}OverridepublicbooleandeleteById(Stringid)throwsException{try{returnsuper.removeById(id);}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}/** * 测试回滚两个保存方法,其中一个方法是另外服务实例的方法 * return * throws Exception */OverridepublicbooleantestTx1()throwsException{try{TestOneInfoonenewTestOneInfo();one.setId(1);one.setName(TestOne);save(one);TestTwoInfotwonewTestTwoInfo();two.setId(2);two.setName(TestTwo);testTwoService.save(two);inti1/0;returnfalse;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}/** * 测试回滚两个保存方法,其中一个方法是调用另外服务实例中的方法 * param t * return * throws Exception */OverridepublicbooleantestTx2(TestOneInfot)throwsException{try{save(t);TestTwoInfotwonewTestTwoInfo();two.setId(2);two.setName(TestTwo);testTx3(two);inti1/0;returnfalse;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}OverridepublicbooleantestTx3(TestTwoInfot)throwsException{try{testTwoService.save(t);returnfalse;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}/** * 测试回滚两个保存方法,其中一个方法是私有方法 * param t * return * throws Exception */OverridepublicbooleantestTx4(TestOneInfot)throwsException{try{save(t);TestTwoInfotwonewTestTwoInfo();two.setId(2);two.setName(TestTwo);testTx5(two);inti1/0;returnfalse;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}privatebooleantestTx5(TestTwoInfot)throwsException{try{testTwoService.save(t);returnfalse;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}OverridepublicIPageTestOneInfoqueryName(IntegerpageNo,IntegerpageSize,Stringname,StringorderColumn,Stringorder)throwsException{try{PageTestOneInfopnewPageTestOneInfo(pageNo,pageSize);QueryWrapperwrappernewQueryWrapperTestOneInfo();wrapper.like(name,name);returnpage(p,wrapper);}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}OverridepublicIPageTestOneInfoqueryMethod(IntegerpageNo,IntegerpageSize,StringorderColumn,Stringorder,QueryWrapperTestOneInfoqueryWrapper)throwsException{try{PageTestOneInfopnewPageTestOneInfo(pageNo,pageSize);IPageTestOneInfopageListtestOneMapper.queryList(p,queryWrapper);returnpageList;}catch(Exceptione){log.error(e.getMessage(),e);throwe;}}}OptimisticLockTest.javapackagecom.hk.user;importcom.hk.Starter;importcom.hk.entity.TestOneInfo;importcom.hk.service.ITestOneService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;importorg.springframework.util.Assert;importjava.util.List;RunWith(SpringRunner.class)SpringBootTest(webEnvironmentSpringBootTest.WebEnvironment.RANDOM_PORT,classesStarter.class)publicclassOptimisticLockTest{AutowiredprivateITestOneServicetestOneServ;/** * 使用默认数据源测试Mybatis乐观锁控制 * throws Exception */TestpublicvoidtestOptimisticLock()throwsException{ListTestOneInfolsttestOneServ.list();for(TestOneInfot:lst)testOneServ.delete(t);TestOneInfoonenewTestOneInfo();one.setId(1);one.setName(testone1);testOneServ.save(one);TestOneInfosaveOnetestOneServ.get(1);saveOne.setName(testone1-saveonceMath.random());testOneServ.saveOrUpdate(saveOne);//保存一次后检查版本是否变为1saveOnetestOneServ.get(1);System.out.println(saveOne.versionsaveOne.getVersion());Assert.isTrue(saveOne.getVersion()1);//保存版本为0的对象,捕捉乐观锁异常try{//此时one版本为0,应该保存失败booleanbtestOneServ.saveOrUpdate(one);System.out.println(saveOne.bb);Assert.isTrue(b,数据记录版本冲突);}catch(Exceptione){e.printStackTrace();}}}