如果只是单纯地将Mapper语句放在循环中,那么会为每次的循环都创建一个事务,导致大批量的sql耗时会很长。
如果我们让在同一个循环中的Mapper语句在一个事务中提交,批处理这些sql,不多次创建事务,那么我们就能极大地改善大批量sql的执行时间了。
代码如下:
java
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 {
@Autowired
private 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();
}
}