之前一直动手用过mybatis,这次刚好项目需要,做了个小项目,但是我没发现myBatista的批量插入数据的接口,可能是没找到,也或许真的没有。然后网上找了个方式如下:
在xml文件中这样写
<insert id="addDataBach"parameterType="arraylist">
INSERT INTO eimm_basic_enterprise_power ([id], [userCode], [userName], [yearAndMonth], [zcbh], [yearDj], [mothDj], [createTime],[guiShang],[totalYd])
VALUES
<foreach collection="bascBatch" item="ba" separator=",">
(#{ba.id}, #{ba.userCode}, #{ba.userName}, #{ba.yearAndMonth}, #{ba.zcbh}, #{ba.yearDj}, #{ba.mothDj}, #{ba.createTime},#{ba.guiShang},#{ba.totalYd})
</foreach>
</insert>
以上可以进行批量对象保存了,但是会发现一个小问题,当一个集合包含过多对象,或者一个对象字段很多时候,会报一个错误,大意就是 总共的参数长度,不能超过2100个字符。
然后我的解决方式是:直接用2100除以 我性需要保存的对象的字段数,取整结果就是一次批量最多支持集合对象数,处理逻辑如下:
public int addDataBach(List<BasicEnterprisePower> basicList) {
List<BasicEnterprisePower> batchList = new ArrayList<>();
System.out.println("基础数据批量保存:"+basicList.size());
int i=0;
for (BasicEnterprisePower ba:basicList) {
batchList.add(ba);
if(++i% CommonEnv.basic_parm_num ==0) {
basicEnterprisePowerMapper.addDataBach(batchList);
batchList.clear();
continue;
}
if(basicList.size()==i) {
basicEnterprisePowerMapper.addDataBach(batchList);
}
}
return i;
}
由于时间紧张,这个批量处理暂时就用的这个方法了,其中的CommonEnv.basic_parm_num就是通过计算出来一次最多支持保存的对象数,这样显得不太灵活,还没有时间设计更好的处理方式。
不过通过测试 这样批量处理处理已经比循环单条处理快6倍左右(这里用的3万条数据测试)。