Browse Source

去除全局缓存sqlSession,增加Model,通用service层sqlSession释放.修改测试用例异常范围.

聂秋秋 7 years ago
parent
commit
1ddc7c6f3f

+ 0 - 8
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java

@@ -19,7 +19,6 @@ import java.io.Serializable;
 import java.util.Set;
 import java.util.Set;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.ConcurrentSkipListSet;
 
 
-import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.session.SqlSessionFactory;
 
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.DbType;
@@ -29,10 +28,8 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-
 import lombok.Data;
 import lombok.Data;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
-import org.mybatis.spring.SqlSessionTemplate;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -67,10 +64,6 @@ public class GlobalConfig implements Serializable {
      * SQL注入器
      * SQL注入器
      */
      */
     private ISqlInjector sqlInjector;
     private ISqlInjector sqlInjector;
-    /**
-     * 单例重用SqlSession
-     */
-    private SqlSession sqlSession;
     /**
     /**
      * 缓存当前Configuration的SqlSessionFactory
      * 缓存当前Configuration的SqlSessionFactory
      */
      */
@@ -91,7 +84,6 @@ public class GlobalConfig implements Serializable {
      */
      */
     public SqlSessionFactory signGlobalConfig(SqlSessionFactory sqlSessionFactory) {
     public SqlSessionFactory signGlobalConfig(SqlSessionFactory sqlSessionFactory) {
         if (null != sqlSessionFactory) {
         if (null != sqlSessionFactory) {
-            this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
             GlobalConfigUtils.setGlobalConfig(sqlSessionFactory.getConfiguration(), this);
             GlobalConfigUtils.setGlobalConfig(sqlSessionFactory.getConfiguration(), this);
         }
         }
         return sqlSessionFactory;
         return sqlSessionFactory;

+ 75 - 10
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/activerecord/Model.java

@@ -20,10 +20,12 @@ import com.baomidou.mybatisplus.core.enums.SqlMethod;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlHelper;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlHelper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
 import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSession;
+import org.mybatis.spring.SqlSessionUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
@@ -51,7 +53,13 @@ public abstract class Model<T extends Model> implements Serializable {
      */
      */
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean insert() {
     public boolean insert() {
-        return SqlHelper.retBool(sqlSession().insert(sqlStatement(SqlMethod.INSERT_ONE), this));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), this));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
+        
     }
     }
 
 
     /**
     /**
@@ -82,7 +90,12 @@ public abstract class Model<T extends Model> implements Serializable {
      */
      */
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean deleteById(Serializable id) {
     public boolean deleteById(Serializable id) {
-        return SqlHelper.delBool(sqlSession().delete(sqlStatement(SqlMethod.DELETE_BY_ID), id));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.delBool(sqlSession.delete(sqlStatement(SqlMethod.DELETE_BY_ID), id));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
     }
 
 
     /**
     /**
@@ -110,7 +123,13 @@ public abstract class Model<T extends Model> implements Serializable {
     public boolean delete(Wrapper wrapper) {
     public boolean delete(Wrapper wrapper) {
         Map<String, Object> map = new HashMap<>(1);
         Map<String, Object> map = new HashMap<>(1);
         map.put(Constants.WRAPPER, wrapper);
         map.put(Constants.WRAPPER, wrapper);
-        return SqlHelper.delBool(sqlSession().delete(sqlStatement(SqlMethod.DELETE), map));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.delBool(sqlSession.delete(sqlStatement(SqlMethod.DELETE), map));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
+        
     }
     }
 
 
     /**
     /**
@@ -124,7 +143,13 @@ public abstract class Model<T extends Model> implements Serializable {
         // updateById
         // updateById
         Map<String, Object> map = new HashMap<>(1);
         Map<String, Object> map = new HashMap<>(1);
         map.put(Constants.ENTITY, this);
         map.put(Constants.ENTITY, this);
-        return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE_BY_ID), map));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.update(sqlStatement(SqlMethod.UPDATE_BY_ID), map));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
+        
     }
     }
 
 
     /**
     /**
@@ -141,7 +166,12 @@ public abstract class Model<T extends Model> implements Serializable {
         map.put(Constants.ENTITY, this);
         map.put(Constants.ENTITY, this);
         map.put(Constants.WRAPPER, wrapper);
         map.put(Constants.WRAPPER, wrapper);
         // update
         // update
-        return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE), map));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.update(sqlStatement(SqlMethod.UPDATE), map));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
     }
 
 
     /**
     /**
@@ -152,7 +182,13 @@ public abstract class Model<T extends Model> implements Serializable {
      * @return
      * @return
      */
      */
     public List<T> selectAll() {
     public List<T> selectAll() {
-        return sqlSession().selectList(sqlStatement(SqlMethod.SELECT_LIST));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return sqlSession.selectList(sqlStatement(SqlMethod.SELECT_LIST));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
+        
     }
     }
 
 
     /**
     /**
@@ -164,7 +200,13 @@ public abstract class Model<T extends Model> implements Serializable {
      * @return
      * @return
      */
      */
     public T selectById(Serializable id) {
     public T selectById(Serializable id) {
-        return sqlSession().selectOne(sqlStatement(SqlMethod.SELECT_BY_ID), id);
+        SqlSession sqlSession = sqlSession();
+        try {
+            return sqlSession.selectOne(sqlStatement(SqlMethod.SELECT_BY_ID), id);
+        }finally {
+            closeSqlSession(sqlSession);
+        }
+        
     }
     }
 
 
     /**
     /**
@@ -191,7 +233,12 @@ public abstract class Model<T extends Model> implements Serializable {
     public List<T> selectList(Wrapper wrapper) {
     public List<T> selectList(Wrapper wrapper) {
         Map<String, Object> map = new HashMap<>(1);
         Map<String, Object> map = new HashMap<>(1);
         map.put(Constants.WRAPPER, wrapper);
         map.put(Constants.WRAPPER, wrapper);
-        return sqlSession().selectList(sqlStatement(SqlMethod.SELECT_LIST), map);
+        SqlSession sqlSession = sqlSession();
+        try {
+            return sqlSession.selectList(sqlStatement(SqlMethod.SELECT_LIST), map);
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
     }
 
 
     /**
     /**
@@ -219,7 +266,12 @@ public abstract class Model<T extends Model> implements Serializable {
         Map<String, Object> map = new HashMap<>(2);
         Map<String, Object> map = new HashMap<>(2);
         map.put(Constants.WRAPPER, SqlHelper.fillWrapper(page, wrapper));
         map.put(Constants.WRAPPER, SqlHelper.fillWrapper(page, wrapper));
         map.put("page", page);
         map.put("page", page);
-        page.setRecords(sqlSession().selectList(sqlStatement(SqlMethod.SELECT_PAGE), map));
+        SqlSession sqlSession = sqlSession();
+        try {
+            page.setRecords(sqlSession.selectList(sqlStatement(SqlMethod.SELECT_PAGE), map));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
         return page;
         return page;
     }
     }
 
 
@@ -234,7 +286,12 @@ public abstract class Model<T extends Model> implements Serializable {
     public int selectCount(Wrapper wrapper) {
     public int selectCount(Wrapper wrapper) {
         Map<String, Object> map = new HashMap<>(1);
         Map<String, Object> map = new HashMap<>(1);
         map.put(Constants.WRAPPER, wrapper);
         map.put(Constants.WRAPPER, wrapper);
-        return SqlHelper.retCount(sqlSession().<Integer>selectOne(sqlStatement(SqlMethod.SELECT_COUNT), map));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retCount(sqlSession.<Integer>selectOne(sqlStatement(SqlMethod.SELECT_COUNT), map));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
     }
 
 
     /**
     /**
@@ -279,4 +336,12 @@ public abstract class Model<T extends Model> implements Serializable {
      * 主键值
      * 主键值
      */
      */
     protected abstract Serializable pkVal();
     protected abstract Serializable pkVal();
+    
+    /**
+     * 释放sqlSession
+     * @param sqlSession session
+     */
+    private void closeSqlSession(SqlSession sqlSession){
+        SqlSessionUtils.closeSqlSession(sqlSession, GlobalConfigUtils.currentSessionFactory(getClass()));
+    }
 }
 }

+ 40 - 18
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/impl/ServiceImpl.java

@@ -22,8 +22,10 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSession;
+import org.mybatis.spring.SqlSessionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
@@ -83,7 +85,15 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
     protected SqlSession sqlSessionBatch() {
     protected SqlSession sqlSessionBatch() {
         return SqlHelper.sqlSessionBatch(currentModelClass());
         return SqlHelper.sqlSessionBatch(currentModelClass());
     }
     }
-
+    
+    /**
+     * 释放sqlSession
+     * @param sqlSession session
+     */
+    private void closeSqlSession(SqlSession sqlSession){
+        SqlSessionUtils.closeSqlSession(sqlSession, GlobalConfigUtils.currentSessionFactory(currentModelClass()));
+    }
+    
     /**
     /**
      * 获取SqlStatement
      * 获取SqlStatement
      *
      *
@@ -118,14 +128,18 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
         SqlSession batchSqlSession = sqlSessionBatch();
         SqlSession batchSqlSession = sqlSessionBatch();
         int i = 0;
         int i = 0;
         String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);
         String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);
-        for (T anEntityList : entityList) {
-            batchSqlSession.insert(sqlStatement, anEntityList);
-            if (i >= 1 && i % batchSize == 0) {
-                batchSqlSession.flushStatements();
+        try {
+            for (T anEntityList : entityList) {
+                batchSqlSession.insert(sqlStatement, anEntityList);
+                if (i >= 1 && i % batchSize == 0) {
+                    batchSqlSession.flushStatements();
+                }
+                i++;
             }
             }
-            i++;
+            batchSqlSession.flushStatements();
+        }finally {
+            closeSqlSession(batchSqlSession);
         }
         }
-        batchSqlSession.flushStatements();
         return true;
         return true;
     }
     }
 
 
@@ -172,10 +186,14 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
             throw new IllegalArgumentException("Error: entityList must not be empty");
             throw new IllegalArgumentException("Error: entityList must not be empty");
         }
         }
         SqlSession batchSqlSession = sqlSessionBatch();
         SqlSession batchSqlSession = sqlSessionBatch();
-        for (T anEntityList : entityList) {
-            saveOrUpdate(anEntityList);
+        try {
+            for (T anEntityList : entityList) {
+                saveOrUpdate(anEntityList);
+            }
+            batchSqlSession.flushStatements();
+        }finally {
+            closeSqlSession(batchSqlSession);
         }
         }
-        batchSqlSession.flushStatements();
         return true;
         return true;
     }
     }
 
 
@@ -227,16 +245,20 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
         SqlSession batchSqlSession = sqlSessionBatch();
         SqlSession batchSqlSession = sqlSessionBatch();
         int i = 0;
         int i = 0;
         String sqlStatement = sqlStatement(SqlMethod.UPDATE_BY_ID);
         String sqlStatement = sqlStatement(SqlMethod.UPDATE_BY_ID);
-        for (T anEntityList : entityList) {
-            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
-            param.put(Constants.ENTITY, anEntityList);
-            batchSqlSession.update(sqlStatement, param);
-            if (i >= 1 && i % batchSize == 0) {
-                batchSqlSession.flushStatements();
+        try {
+            for (T anEntityList : entityList) {
+                MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
+                param.put(Constants.ENTITY, anEntityList);
+                batchSqlSession.update(sqlStatement, param);
+                if (i >= 1 && i % batchSize == 0) {
+                    batchSqlSession.flushStatements();
+                }
+                i++;
             }
             }
-            i++;
+            batchSqlSession.flushStatements();
+        }finally {
+            closeSqlSession(batchSqlSession);
         }
         }
-        batchSqlSession.flushStatements();
         return true;
         return true;
     }
     }
 
 

+ 2 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/ActiveRecordTest.java

@@ -1,6 +1,7 @@
 package com.baomidou.mybatisplus.test.h2;
 package com.baomidou.mybatisplus.test.h2;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -112,7 +113,7 @@ public class ActiveRecordTest {
     public void testTransactional(){
     public void testTransactional(){
         try {
         try {
             h2StudentService.testTransactional();
             h2StudentService.testTransactional();
-        }catch (Exception e){
+        }catch (MybatisPlusException e){
             List<H2Student> students = new H2Student().selectList(new QueryWrapper<H2Student>().lambda().like(H2Student::getName, "tx"));
             List<H2Student> students = new H2Student().selectList(new QueryWrapper<H2Student>().lambda().like(H2Student::getName, "tx"));
             Assert.assertTrue(CollectionUtils.isEmpty(students));
             Assert.assertTrue(CollectionUtils.isEmpty(students));
         }
         }

+ 6 - 2
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -6,10 +6,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import org.junit.Assert;
 import org.junit.Assert;
+import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -28,6 +31,7 @@ import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
  * @author Caratacus
  * @author Caratacus
  * @since 2017/4/1
  * @since 2017/4/1
  */
  */
+@FixMethodOrder(MethodSorters.JVM)
 @RunWith(SpringJUnit4ClassRunner.class)
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = {"classpath:h2/spring-test-h2.xml"})
 @ContextConfiguration(locations = {"classpath:h2/spring-test-h2.xml"})
 public class H2UserTest extends BaseTest {
 public class H2UserTest extends BaseTest {
@@ -263,7 +267,7 @@ public class H2UserTest extends BaseTest {
     public void testBatchTransactional(){
     public void testBatchTransactional(){
         try {
         try {
             userService.testBatchTransactional();
             userService.testBatchTransactional();
-        }catch (Exception e){
+        }catch (MybatisPlusException e){
             List<H2User> list = userService.list(new QueryWrapper<H2User>().like("name", "batch"));
             List<H2User> list = userService.list(new QueryWrapper<H2User>().like("name", "batch"));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
         }
         }
@@ -273,7 +277,7 @@ public class H2UserTest extends BaseTest {
     public void testSimpleTransactional(){
     public void testSimpleTransactional(){
         try {
         try {
             userService.testSimpleTransactional();
             userService.testSimpleTransactional();
-        }catch (Exception e){
+        }catch (MybatisPlusException e){
             List<H2User> list = userService.list(new QueryWrapper<H2User>().like("name", "simple"));
             List<H2User> list = userService.list(new QueryWrapper<H2User>().like("name", "simple"));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
         }
         }

+ 4 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/SqlRunnerTest.java

@@ -4,8 +4,10 @@ package com.baomidou.mybatisplus.test.h2;
 import java.util.List;
 import java.util.List;
 
 
 import org.junit.Assert;
 import org.junit.Assert;
+import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
 import org.mockito.internal.matchers.GreaterThan;
 import org.mockito.internal.matchers.GreaterThan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.ContextConfiguration;
@@ -22,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
  *  SqlRunner测试
  *  SqlRunner测试
  * @author nieqiurong 2018/8/25 11:05.
  * @author nieqiurong 2018/8/25 11:05.
  */
  */
+@FixMethodOrder(MethodSorters.JVM)
 @RunWith(SpringJUnit4ClassRunner.class)
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = {"classpath:h2/spring-test-h2.xml"})
 @ContextConfiguration(locations = {"classpath:h2/spring-test-h2.xml"})
 public class SqlRunnerTest {
 public class SqlRunnerTest {
@@ -52,7 +55,7 @@ public class SqlRunnerTest {
     public void testTransactional(){
     public void testTransactional(){
         try {
         try {
             studentService.testSqlRunnerTransactional();
             studentService.testSqlRunnerTransactional();
-        } catch (Exception e){
+        } catch (RuntimeException e){
             List<H2Student> list = studentService.list(new QueryWrapper<H2Student>().like("name", "sqlRunnerTx"));
             List<H2Student> list = studentService.list(new QueryWrapper<H2Student>().like("name", "sqlRunnerTx"));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
             Assert.assertTrue(CollectionUtils.isEmpty(list));
         }
         }

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/service/impl/H2StudentServiceImpl.java

@@ -21,7 +21,7 @@ public class H2StudentServiceImpl extends ServiceImpl<H2StudentMapper,H2Student>
         new H2Student(null, "tx1", 2).insert();
         new H2Student(null, "tx1", 2).insert();
         new H2Student(null, "tx2", 2).insert();
         new H2Student(null, "tx2", 2).insert();
         new H2Student(null, "tx3", 2).insert();
         new H2Student(null, "tx3", 2).insert();
-        throw new RuntimeException("测试AR事务回滚");
+        throw new MybatisPlusException("测试AR事务回滚");
     }
     }
 
 
     @Override
     @Override