如果只是单纯地将Mapper语句放在循环中,那么会为每次的循环都创建一个事务,导致大批量的sql耗时会很长。
如果我们让在同一个循环中的Mapper语句在一个事务中提交,批处理这些sql,不多次创建事务,那么我们就能极大地改善大批量sql的执行时间了。
代码如下:
import com.hbnu.mapper.TestMapper;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TestService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;public void BatchDoSql(){//关闭自动提交,开启事务,即开启批处理SqlSession sqlSession= sqlSessionFactory.openSession(ExecutorType.BATCH,false);//获取Mapper映射TestMapper mapper=sqlSession.getMapper(TestMapper.class);try{for(int i=0;i<50000;i++){String data="test";mapper.insert(data);}sqlSession.commit();//将sql一次性提交}catch (Exception e){sqlSession.rollback();//回滚throw e;}sqlSession.close();}
}