Mysql 每次插入一条数据,循环插入的效率很低,可采用批量插入,一次插入500条来提升效率。
Mybatis写法示例:
<insert id="insertByList" parameterType="java.util.List">
insert into t_voucher (id, account, ccheck, csign, cbook, cdigest, dbill_date, ino_id, ccode, md, mc, mc_f, cexch_name, currency_code, md_f, inid, iperiod, cbill, nfrat, iyear, cdept_id, org_id, cperson_id, ccus_id, csup_id, cbankaccount_id, ccashitem_id, citem_id, ccontract_id, cfinalclient_id, cbizmodel_id, carea_id, cindustry_id, activity_no, status_code, deleted_flag, createtime, createdby, updatetime, updatedby )
values
<foreach collection ="list" item="v" index= "index" separator =",">
( #{v.id,jdbcType=INTEGER}, #{v.account,jdbcType=VARCHAR}, #{v.ccheck,jdbcType=VARCHAR}, #{v.csign,jdbcType=VARCHAR}, #{v.cbook,jdbcType=VARCHAR}, #{v.cdigest,jdbcType=VARCHAR}, #{v.dbill_date,jdbcType=VARCHAR}, #{v.ino_id,jdbcType=DECIMAL}, #{v.ccode,jdbcType=VARCHAR}, #{v.md,jdbcType=DECIMAL}, #{v.mc,jdbcType=DECIMAL}, #{v.mc_f,jdbcType=DECIMAL}, #{v.cexch_name,jdbcType=VARCHAR}, #{v.currency_code,jdbcType=VARCHAR}, #{v.md_f,jdbcType=DECIMAL}, #{v.inid,jdbcType=DECIMAL}, #{v.iperiod,jdbcType=DECIMAL}, #{v.cbill,jdbcType=VARCHAR}, #{v.nfrat,jdbcType=DECIMAL}, #{v.iyear,jdbcType=DECIMAL}, #{v.cdept_id,jdbcType=VARCHAR}, #{v.org_id,jdbcType=VARCHAR}, #{v.cperson_id,jdbcType=VARCHAR}, #{v.ccus_id,jdbcType=VARCHAR}, #{v.csup_id,jdbcType=VARCHAR}, #{v.cbankaccount_id,jdbcType=VARCHAR}, #{v.ccashitem_id,jdbcType=VARCHAR}, #{v.citem_id,jdbcType=VARCHAR}, #{v.ccontract_id,jdbcType=VARCHAR}, #{v.cfinalclient_id,jdbcType=VARCHAR}, #{v.cbizmodel_id,jdbcType=VARCHAR}, #{v.carea_id,jdbcType=VARCHAR}, #{v.cindustry_id,jdbcType=VARCHAR}, #{v.activity_no,jdbcType=VARCHAR}, #{v.status_code,jdbcType=CHAR}, #{v.deleted_flag,jdbcType=BIT}, #{v.createtime,jdbcType=VARCHAR}, #{v.createdby,jdbcType=VARCHAR}, #{v.updatetime,jdbcType=VARCHAR}, #{v.updatedby,jdbcType=VARCHAR} )
</foreach >
</insert>
核心java代码部分:
// 批量插入每次500
for (int i=0 ; i<=list.size()-1; i= i+500) {
int end = i+500;
if(end >= list.size()){
end = list.size();
}
List<Voucher> newList = list.subList(i,end);
voucherMapper.insertByList(newList);
}