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>