在springboot环境下,使用sql server数据库和jdk 1.8版本时,我们对比了三种批量插入数据的方式。以下是对这三种方法的详细分析和结论:
结论
对于少量数据的插入,建议使用反复执行单条插入语句的方式,因为这种方法简单易用。对于大量数据的插入,推荐使用批处理执行的方式。在我的测试环境中,插入20条左右的数据时,两种方法的耗时都在百毫秒级别,但批处理方式在处理大量数据时表现更好。无论何时,都不建议使用XML拼接SQL的方式。
三种插入方式的详细对比
1. 反复执行单条插入语句
这种方法的实现非常简单,适合少量数据的插入。使用tk.Mapper插件时,代码量极少,仅需以下几行代码:
@Transactional public void add1(List- itemList) { itemList.forEach(itemMapper::insertSelective); }
优点:
- 代码量少,易于实现。
- 适合少量数据的插入。
缺点:
- 时间复杂度为O(n),效率较低。
2. XML拼接SQL
这种方法涉及到大段的XML和SQL语句,需要手动拼接SQL语句,容易出错且工作效率低。此外,在插入大量数据时,可能会因为SQL语句过长而报错。
INSERT INTO tb_item VALUES (newId(),#{item.uniqueCode},#{item.projectId},#{item.name},#{item.type},#{item.packageUnique}, #{item.isPackage},#{item.factoryId},#{item.projectName},#{item.spec},#{item.length},#{item.weight}, #{item.material},#{item.setupPosition},#{item.areaPosition},#{item.bottomHeight},#{item.topHeight}, #{item.serialNumber},#{item.createTime}
优点:
- 在小数据量时,效率尚可。
缺点:
- 代码复杂,容易出错。
- 在大量数据插入时容易报错,例如在SQL Server中,插入500条和1000条数据时报错,提示SQL语句过长。
- 不推荐使用。
3. 批处理执行
批处理执行适合大量数据的插入,效率高且实现相对简单。
@Service
public class ItemService {
@Autowired
private ItemMapper itemMapper;
@Autowired
private SqlSessionFactory sqlSessionFactory;
// 批处理
@Transactional
public void add(List- 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 == 0) {
session.commit();
}
}
session.commit();
session.close();
}
}
优点:
- 适合大量数据的插入,效率高。
- 时间复杂度为O(logn),且常数较小。
缺点:
- 比单条插入复杂,但仍较为简单。
测试结果
在测试中,插入10条和25条数据时,三种方法的耗时都在百毫秒级别,但XML拼接SQL的方式在插入500条和1000条数据时报错,提示SQL语句过长。
总结
- 少量数据插入(如20条以内):使用反复执行单条插入语句,简单且易于实现。
- 大量数据插入:使用批处理执行,效率高且稳定。
- 不推荐使用:XML拼接SQL的方式,因其复杂且容易出错。
通过以上对比和分析,可以根据具体需求选择最适合的插入方式。











