包括,【批量插入】,【批量删除】,【批量更新,待完成…】
目录
(1)问题1:因为是批量插入数据,无法获取到插入数据的id号:
(2)问题2:批量插入的时候,为了能够满足数据包大小的要求,有时需要采取【分组批量插入的策略】
一:不使用批处理时,速度很慢,效率低(以插入为例)
(1)Mapper XML中的SQL语句
(2)测试代码:插入一万条数据;
/**
* JUnit单元测试类
*/
public class MyBatisTestor {
@Test
public void testInsert1() throws Exception {
SqlSession session = null;
try {
long st = new Date().getTime();
session = MyBatisUtils.openSession();
List list = new ArrayList();
for(int i=0;i<10000;i++){
Goods goods = new Goods();
goods.setTitle("测试商品");
goods.setSubTitle("测试子标题");
goods.setOriginalCost(200f);
goods.setCurrentPrice(100f);
goods.setDiscount(0.5f);
goods.setIsFreeDelivery(1);
goods.setCategoryId(43);
session.insert("goods.insert1", goods);
}
session.commit();
long et = new Date().getTime();
System.out.println("整个插入操作花费时间为:"+(et - st)+"毫秒。");
} catch (Exception e) {
if (session != null) {
session.rollback();
}
throw e;
}finally {
MyBatisUtils.closeSession(session);
}
}
}
即上面代码的逻辑是每次只插入一条,一共调用了Mapper XML中的SQL一万次;
运行结果:
二:批处理之:批量插入;(和一对比一下)
利用集合保存数据,然后调用Mapper XML中的SQL语句,把这个集合作为参数传过去,实现批处理。
(1)Mapper XML中的SQL语句
<!--
insert into table(字段1,字段2) values(v1,v2),(v1,v2);
-->
<insert id="batchInsert" parameterType="java.util.List">
insert into t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.title},#{item.subTitle},#{item.originalCost},#{item.currentPrice},#{item.discount},#{item.isFreeDelivery},#{item.categoryId})
</foreach>
</insert>
说明:
(1)parameterType设置成List
(2)插入多条数据,(insert语句的用法可以参考