Mybatis实现分批次批量插入数据至Oracle

Mybatis实现分批次批量插入数据至Oracle

  • 原始方法–遍历list逐条插入:
for (ActionUser actionUser : actionUsers) {
    actionUserDao.insertActionUser(actionUser);
}
<insert id="insertActionUser" parameterType="com.memberControl.model.ActionUser">
    insert  into td_action_user(action_id,phone_number,flag)
    values(#{user.actionId}, #{user.phoneNumber}, #{user.flag})  
</insert>

问题:该方法只适合插入少量数据,当数据量大了会导致插入效率非常低,程序开销也很大,与数据库交互次数太多。

  • 为了解决该问题,采用分批次批量插入的方法(这里采用1000条插入一次的方法):

目前采用此办法极大地提高了程序效率,记录一下,期待发现更优的方法。

   //限制条数
    int pointsDataLimit = 1000;
    Integer size = actionUsers.size();
    //判断是否有必要分批
    if(pointsDataLimit<size){
        //分批数
        int part = size/pointsDataLimit;
        for (int i = 0; i < part; i++) {
        //1000条插入一次
        List<ActionUser> listPage = actionUsers.subList(0, pointsDataLimit);
        actionUserDao.insertActionUser(listPage);
        //剔除已经插入的
        actionUsers.subList(0, pointsDataLimit).clear();
        }
        if (actionUsers.size()>0){
            //新增最后剩下的
            actionUserDao.insertActionUser(actionUsers);
        }
    }else{
        actionUserDao.insertActionUser(actionUsers);
    }
<insert id="insertActionUser" parameterType="com.memberControl.model.ActionUser">
    insert  into td_action_user(action_id,phone_number,flag)
    <foreach collection="list" item="user" separator=" union all ">
        (SELECT #{user.actionId}, #{user.phoneNumber}, #{user.flag} FROM dual)
    </foreach>
</insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值