事情起因
今天上班刚坐下就听见了同事的哀嚎,于是就有了下面的对话
- 小白:啊啊啊啊啊,昨天晚上谁动我电脑了,我数据白跑了,今天又要跑一天数据。
- 我:怎么了?刚上班就崩溃啦
- 小白:我昨天晚上跑的数据没有跑完,今天又要重新跑,估计今天又要加班了。
- 我:怎么回事,我给看看
于是我看了下他写得代码,业务还是蛮简单的,从A库查出数据,然后处理一下存入B库中,数据量大概有十万条左右,每次跑数据要两个小时左右。我一看代码就知道为什么需要这么久了,他代码里面是每查出一条数据然后插入一条,频繁的与数据库建立连接,当然慢啦
于是我把他代码优化了一下,不需要每次插入与数据库建立连接,而是批量插入,代码如下:
mybatis批量插入
mapper接口层
public void insertAll(@Param("list")List<User> users);
xml层
<insert id="insertAll" parameterType="List">
insert into zjb_crk(vfid,vgsdm,vdjh,vxmh,vydlx,vwlbm,vpch,nsl,vjldw,nje,vhblx, nzhhl, ccrkrq,dcjrq, dxgrq,vjldwid,vhblxid)
select A.*
from(
<foreach collection="list" item="item" separator="union all" >
select
#{item.vfid} vfid,#{item.vgsdm} vgsdm,#{item.vdjh} vdjh,#{item.vxmh} vxmh,#{item.vydlx} vydlx,#{item.vwlbm} vwlbm,#{item.vpch} vpch,#{item.nsl} nsl,#{item.vjldw} vjldw,#{item.nje} nje,#{item.vhblx} vhblx,#{item.nzhhl} nzhhl,#{item.ccrkrq} ccrkrq,#{item.dcjrq} dcjrq,#{item.dxgrq} dxgrq,#{item.vjldwid} vjldwid,#{item.vhblxid} vhblxid
from dual
</foreach>
)A
</insert>
经过我的改造,从以前的两个小时优化到两分钟左右,又是深藏功与名的一天呢。
PS:上面的代码是批量插入到oracle数据库的代码,下面的插入到Mybatis的代码,接口层是一样的
<insert id="batchInsert" parameterType="java.util.List">
insert into user ( age, create_user_id )
values
<foreach item="item" collection="list" separator="," index="index">
( #{item.age}, #{item.createUserId} )
</foreach>
</insert>