mybatis使用ExecutorType.BATCH方式批量插入数据

有从excel中导入大量数据到数据库这种需求,如果一条一条insert就会很慢,mybatis默认是ExecutorType.SIMPLE方式.
1.service代码

    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    /**
     * 批量插入
     * @param entityList
     * @return
     */
    public int batchInsertEntity(List<Entity> entityList){
        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
        try{
            EntityMapper mapper = session.getMapper(EntityMapper.class);
            entityList.forEach(item->{
                mapper.mergeInsertOneEntity(item);
            });
            session.commit();
        }
        finally {
            session.close();
        }
        return entityList.size();
    }

2.mapper.xml文件,我这里是写的是插入或更新语句,数据库是oracle,所以用merge into这种写法,判断条件,如果流水号存在,则更新,否则插入,mysql则是insert on duplicate key update 那种写法,如果这里不需要插入或更新,那就写普通的insert语句就可以了.

 <insert id="mergeInsertOneEntity"
            parameterType="Entity">
        MERGE INTO business_entity T1 USING (SELECT
        <trim prefix="" suffix="" suffixOverrides=",">
        <if test="payTime != null  and payTime != ''">#{payTime} as pay_time,</if>
        <if test="bankserialNumber != null  and bankserialNumber != ''">#{bankserialNumber} as bankserial_number,</if>
        </trim>
         FROM dual) T2
        ON ( T1.bankserial_number = T2.bankserial_number)
        WHEN MATCHED THEN
        UPDATE SET
        <trim prefix="" suffix="" suffixOverrides=",">
            <if test="payTime != null  and payTime != ''">T1.pay_time=T2.pay_time,</if>
        </trim>
        WHEN NOT MATCHED THEN
        INSERT
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="payTime != null  and payTime != ''">pay_time,</if>
            <if test="bankserialNumber != null  and bankserialNumber != ''">bankserial_number,</if>
        </trim>
        VALUES
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="payTime != null  and payTime != ''">T2.pay_time,</if>
            <if test="bankserialNumber != null  and bankserialNumber != ''">T2.bankserial_number,</if>
        </trim>
    </insert>

oracle的merge into 写法

MERGE INTO business_entity T1
USING (SELECT '0' AS BANKSERIAL_NUMBER,'2' as PAY_TIME FROM dual) T2
ON ( T1.BANKSERIAL_NUMBER = T2.BANKSERIAL_NUMBER)
WHEN MATCHED THEN
  UPDATE SET T1.PAY_TIME = T2.PAY_TIME
WHEN NOT MATCHED THEN 
  INSERT (BANKSERIAL_NUMBER, PAY_TIME) VALUES(T2.BANKSERIAL_NUMBER, T2.PAY_TIME);

3.经过测试,导入五千条数据,几秒钟就可以插入完成.
参考资料:https://mp.weixin.qq.com/s/AlhAXtHa3s1gBGWoDNajpg

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值