类 MybatisBatch<T>

java.lang.Object
com.baomidou.mybatisplus.core.batch.MybatisBatch<T>

public class MybatisBatch<T> extends Object
  • 事务需要自行控制
  • 批次数据尽量自行切割处理
  • 关于事务必须执行到flushStatements才具有意义BatchExecutor.doFlushStatements(boolean)无效输入:'<'/>
  • 返回值为批处理结果,如果对返回值比较关心的可接收判断处理
  • saveOrUpdate尽量少用把,保持批处理为简单的插入或更新
  • 关于saveOrUpdate中的sqlSession,如果执行了select操作的话,BatchExecutor都会触发一次flushStatements,为了保证结果集,故使用包装了部分sqlSession查询操作
  • autoCommit参数,在spring下使用的是
    引用无效
    org.mybatis.spring.transaction.SpringManagedTransaction
    ,控制无效,只能通过datasource控制(建议不要修改),单独使用mybatis下JdbcTransaction是可用的
  •      Spring示例:
                    transactionTemplate.execute(new TransactionCallback无效输入:'<'List>() {
                @Override
                            public List doInTransaction(TransactionStatus status) {
                                    MybatisBatch.Method method = new MybatisBatch.Method无效输入:'<'>(DemoMapper.class);
                                    return new MybatisBatch无效输入:'<'>(sqlSessionFactory,demoList).execute(true, method.insert());
                }
            });
     
    从以下版本开始:
    3.5.4
    作者:
    nieqiurong
    • 嵌套类概要

      嵌套类
      修饰符和类型
      说明
      static class 
      内置方法简化调用
    • 构造器概要

      构造器
      构造器
      说明
      MybatisBatch(org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory, Collection<T> dataList)
       
      MybatisBatch(org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory, Collection<T> dataList, int batchSize)
       
    • 方法概要

      修饰符和类型
      方法
      说明
      List<org.apache.ibatis.executor.BatchResult>
      execute(boolean autoCommit, BatchMethod<T> batchMethod)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      execute(boolean autoCommit, String statement)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      execute(boolean autoCommit, String statement, ParameterConvert<T> parameterConvert)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      execute(BatchMethod<T> batchMethod)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      execute(String statement)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      execute(String statement, ParameterConvert<T> parameterConvert)
      执行批量操作
      List<org.apache.ibatis.executor.BatchResult>
      saveOrUpdate(boolean autoCommit, BatchMethod<T> insertMethod, BiPredicate<BatchSqlSession,T> insertPredicate, BatchMethod<T> updateMethod)
      批量保存或更新 这里需要注意一下,如果在insertPredicate里判断调用其他sqlSession(类似mapper.xxx)时,要注意一级缓存问题或数据感知问题(因为当前会话数据还未提交) 举个例子(事务开启状态下): 如果当前批次里面执行两个主键相同的数据,当调用mapper.selectById时,如果数据库未有这条记录,在同个sqlSession下,由于一级缓存的问题,下次再查就还是null,导致插入主键冲突, 但使用 BatchSqlSession时,由于每次select操作都会触发一次flushStatements,就会执行更新操作
      List<org.apache.ibatis.executor.BatchResult>
      saveOrUpdate(BatchMethod<T> insertMethod, BiPredicate<BatchSqlSession,T> insertPredicate, BatchMethod<T> updateMethod)
      批量保存或更新 这里需要注意一下,如果在insertPredicate里判断调用其他sqlSession(类似mapper.xxx)时,要注意一级缓存问题或数据感知问题(因为当前会话数据还未提交) 举个例子(事务开启状态下): 如果当前批次里面执行两个主键相同的数据,当调用mapper.selectById时,如果数据库未有这条记录,在同个sqlSession下,由于一级缓存的问题,下次再查就还是null,导致插入主键冲突, 但使用 BatchSqlSession时,由于每次select操作都会触发一次flushStatements,就会执行更新操作
      protected Object
      toParameter(ParameterConvert<T> parameterConvert, T data)
      参数转换

      从类继承的方法 java.lang.Object

      clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • 构造器详细资料

      • MybatisBatch

        public MybatisBatch(org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory, Collection<T> dataList)
      • MybatisBatch

        public MybatisBatch(org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory, Collection<T> dataList, int batchSize)
    • 方法详细资料

      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(String statement)
        执行批量操作
        参数:
        statement - 执行的 mapper 方法 (示例: com.baomidou.mybatisplus.core.mapper.BaseMapper.insert )
        返回:
        批处理结果
      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(String statement, ParameterConvert<T> parameterConvert)
        执行批量操作
        参数:
        statement - 执行的 mapper 方法 (示例: com.baomidou.mybatisplus.core.mapper.BaseMapper.insert )
        parameterConvert - 参数转换器
        返回:
        批处理结果
      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(boolean autoCommit, String statement)
        执行批量操作
        参数:
        autoCommit - 是否自动提交(这里生效的前提依赖于事务管理器 Transaction)
        statement - 执行的 mapper 方法 (示例: com.baomidou.mybatisplus.core.mapper.BaseMapper.insert )
        返回:
        批处理结果
      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(BatchMethod<T> batchMethod)
        执行批量操作
        参数:
        batchMethod - 批量操作方法
        返回:
        批处理结果
      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(boolean autoCommit, BatchMethod<T> batchMethod)
        执行批量操作
        参数:
        autoCommit - 是否自动提交(这里生效的前提依赖于事务管理器 Transaction)
        batchMethod - 批量操作方法
        返回:
        批处理结果
      • execute

        public List<org.apache.ibatis.executor.BatchResult> execute(boolean autoCommit, String statement, ParameterConvert<T> parameterConvert)
        执行批量操作
        参数:
        autoCommit - 是否自动提交(这里生效的前提依赖于事务管理器 Transaction)
        statement - 执行的 mapper 方法 (示例: com.baomidou.mybatisplus.core.mapper.BaseMapper.insert )
        parameterConvert - 参数转换器
        返回:
        批处理结果
      • saveOrUpdate

        public List<org.apache.ibatis.executor.BatchResult> saveOrUpdate(BatchMethod<T> insertMethod, BiPredicate<BatchSqlSession,T> insertPredicate, BatchMethod<T> updateMethod)
        批量保存或更新 这里需要注意一下,如果在insertPredicate里判断调用其他sqlSession(类似mapper.xxx)时,要注意一级缓存问题或数据感知问题(因为当前会话数据还未提交) 举个例子(事务开启状态下): 如果当前批次里面执行两个主键相同的数据,当调用mapper.selectById时,如果数据库未有这条记录,在同个sqlSession下,由于一级缓存的问题,下次再查就还是null,导致插入主键冲突, 但使用 BatchSqlSession时,由于每次select操作都会触发一次flushStatements,就会执行更新操作
        参数:
        insertMethod - 插入方法
        insertPredicate - 插入条件 (当条件满足时执行插入方法,否则执行更新方法)
        updateMethod - 更新方法
        返回:
        批处理结果
      • saveOrUpdate

        public List<org.apache.ibatis.executor.BatchResult> saveOrUpdate(boolean autoCommit, BatchMethod<T> insertMethod, BiPredicate<BatchSqlSession,T> insertPredicate, BatchMethod<T> updateMethod)
        批量保存或更新 这里需要注意一下,如果在insertPredicate里判断调用其他sqlSession(类似mapper.xxx)时,要注意一级缓存问题或数据感知问题(因为当前会话数据还未提交) 举个例子(事务开启状态下): 如果当前批次里面执行两个主键相同的数据,当调用mapper.selectById时,如果数据库未有这条记录,在同个sqlSession下,由于一级缓存的问题,下次再查就还是null,导致插入主键冲突, 但使用 BatchSqlSession时,由于每次select操作都会触发一次flushStatements,就会执行更新操作
        参数:
        autoCommit - 是否自动提交(这里生效的前提依赖于事务管理器 Transaction)
        insertMethod - 插入方法
        insertPredicate - 插入条件 (当条件满足时执行插入方法,否则执行更新方法)
        updateMethod - 更新方法
        返回:
        批处理结果
      • toParameter

        protected Object toParameter(ParameterConvert<T> parameterConvert, T data)
        参数转换
        参数:
        parameterConvert - 参数转换器
        data - 参数
        返回:
        方法参数