首先,解释:
在oracel中批量插入时是不能用VALUS(值1,值2,值3,值4,。。。。)这种方式进行批量插入的,错误例子如下:
<insert id="XiangGangInser" parameterType="list" useGeneratedKeys="false">
insert into
T_ZJJK_XIANGGANG(MAIL_NUM,CLCT_DATE,WEIGHT,CLCT_CITY,DEST_CD,DEST_PROV,DEST_CITY,AMOUNT)
VALUES
<foreach item="map" index="index" collection="list" open="" separator="," close="">
( #{map.MAILNUM},#{map.CLCTDATE},#{map.WEIGHT},#{map.CLCTCITY},#{map.DESTCD},#
{map.DESTPROV},#{map.DESTCITY},#{map.AMOUNT})
</foreach>
</insert>
正确的方法为:利用oracel的嘘表进行批量插入的操作,例子如下:
<insert id="XiangGangInser" parameterType="list" useGeneratedKeys="false">
insert into T_ZJJK_XIANGGANG(MAIL_NUM,CLCT_DATE,WEIGHT,CLCT_CITY,DEST_CD,DEST_PROV,DEST_CITY,AMOUNT)
<foreach item="map" index="index" collection="list" separator="UNION ALL" >
select
#{map.MAILNUM},#{map.CLCTDATE},#{map.WEIGHT},#{map.CLCTCITY},#{map.DESTCD},#{map.DESTPROV},#{map.DESTCITY},#{map.AMOUNT}
from dual
</foreach>
</insert>
但是需要注意的是:批量插入时不能一次插入太多条数据,会报错sql异常,所以需要分批插入,比如一次两千条的插:
//为了防止SQL语句超出长度出错,进行分批插入
List list = new ArrayList();
int i3 = 0;
if(list.size()==0) {
continue;
}
else if(list.size()<=2000){
// 这里进行数据库的插入操作
i3= inserdao.XiangGangInser(list);
}else{
if ((ii * 2000) == Math.min((ii + 1) * 2000, list.size() - 1)) {
continue;
}
int times = (int)Math.ceil(list.size()/2000.0 );
for(int ii=0; ii<times; ii++ ){
i3 = inserdao.XiangGangInser(list.subList(ii*2000, Math.min((ii+1)*2000,
list.size()-1)));
}
}