mybaits有三种常见的批量插入方式:
-
反复执行单条插入语句
-
xml拼接sql
-
批处理执行
第一种,相当于循环里面反复执行同一条sql语句,当插入的数据量小的时候没啥问题,但是数量超过上千条的时候就效率非常的低。
第二种,不推荐,因为当数量少的时候批量插入没问题,但是当数据量超过500条,或者更多的是时候就直接报错!使用时有大段的xml和sql语句要写,很容易出错,工作效率很低。更关键点是,虽然效率尚可,但是真正需要效率的时候你挂了,要你何用?
第三种,推荐。当批量插入数据量大的时候推荐使用此方法。效率高,使用起来也比较方便。
批处理写法列子:
@Service
public class ItemService {
@Autowired
private ItemMapper itemMapper;
@Autowired
private SqlSessionFactory sqlSessionFactory;
//批处理
@Transactional
public void add(List<Item> itemList) {
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
ItemMapper mapper = session.getMapper(ItemMapper.class);
for (int i = 0; i < itemList.size(); i++) {
mapper.insertSelective(itemList.get(i));
if(i%1000==999){//每1000条提交一次防止内存溢出
session.commit();
session.clearCache();
}
}
session.commit();
session.clearCache();
}
}
三种方法测试结果:
其中 拼接sql方式在插入500条和1000条时报错(似乎是因为sql语句过长,此条跟数据库类型有关,未做其他数据库的测试):com.microsoft.sqlserver.jdbc.SQLServerException
: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确,此RPC请求中提供了过多的参数,最多应为2100
结论
循环插入单条数据虽然效率极低,但是代码量极少
xml拼接sql是最不推荐的方式,使用时有大段的xml和sql语句要写,很容易出错,工作效率很低。更关键点是,虽然效率尚可,但是真正需要效率的时候你挂了,要你何用?
批处理执行是有大数据量插入时推荐的做法,使用起来也比较方便。