废话不多说,直接进入主题:
关于使用mybatis批量插入数据的时候,经常使用的是 foreach在xml里批量插入,代码示如:
<insert id="zybgod" parameterType="map">
INSERT INTO zybgod (id,name,name1,name2,name3,name4,name5,name6,name7,name8)
VALUES
<foreach collection="list" item="item" index="index" separator="," >
(#{item.id},#{item.name},#{item.name1},#{item.name2},#{item.name3},#
{item.name4},#{item.name5},#{item.name6},#{item.name7},#{item.name8})
</foreach>
</insert>
这种情况是完全可以的,但是当数据量比较大的时候,速度就明显的下降了,我测试了一下,插入5W条数据的时候耗时大概4-5秒。这时候再才用这种写法肯定是欠妥的。
接下引入新的批量插入写法,利用Mybatis自带的BATCH进行批量插入,这里主要介绍实践,理论自行查看源码或google。
首先引入SqlSessionTemplate
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
然后
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
TQuotaDao mapper = sqlSession.getMapper(TQuotaDao.class);
for (int i = 1; i < 50000; i++) {
Map map = new HashMap();
map.put("id",i);
map.put("name",i);
map.put("name1",i);
map.put("name2",i);
map.put("name3",i);
map.put("name4",i);
map.put("name5",i);
map.put("name6",i);
map.put("name7",i);
map.put("name8",i);
mapper.zybgod2(map);
}
//提交到数据库,保存数据
sqlSession.flushStatements();
TQuotaDao是我写dao层的类,zybgod2()是dao层插入的方法,注入这里的插入是单条插入不是批量。
放上单条插入xml:
<insert id="zybgod2" parameterType="map">
INSERT INTO zybgod (id,name,name1,name2,name3,name4,name5,name6,name7,name8)
VALUES
(#{id},#{name},#{name1},#{name2},#{name3},#{name4},#{name5},#{name6},#{name7},#{name8})
</insert>
PS:批量更新的话应该也行(我没试过哈~)