Mybatis批量插入性能优化、Merge into用法

本文介绍使用MyBatis通过不同方法实现数据批量插入的方法及其性能对比。详细讲解了如何利用ExecutorType.BATCH进行批量插入操作,以及使用foreach标签进行批量插入的方式,并展示了具体的XML配置代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ExecutorType.BATCH

1w数据插入大概在3s左右
ServiceImpl层

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
	try (SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false)) {
                LzIndexDataMapper indexDataMapper = session.getMapper(LzIndexDataMapper.class);
                dataValueList.forEach(data -> indexDataMapper.insert(data));
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }

Mapper.xml

    <insert id="insert" parameterType="com.mysteel.dataprocessing.excel.soda.parse.mapper.po.IndexDataPo">
        INSERT INTO <include refid="tableName"/> (
        LZ_CODE, CN_NAME, DATA_DATE, DATA_VALUE, CREATE_TIME, UPDATE_TIME
        ) values
        (
        #{lzCode, jdbcType=VARCHAR},
        #{cnName, jdbcType=VARCHAR},
        #{dataDate, jdbcType=VARCHAR},
        #{dataValue, jdbcType=VARCHAR},
        #{createTime, jdbcType=BIGINT},
        #{updateTime, jdbcType=BIGINT}
        )
    </insert>

更新插入——Merge into用法

    <insert id="insertAndUpdate">
        merge into LZ_HGVA_MID t1 using LZ_HGVA_MID_TEMP t2
         on (t1.cn_name = t2.cn_name and t1.data_date = t2.data_date)
         WHEN  MATCHED  THEN
             UPDATE SET  t1.data_value  =  t2.data_value
         WHEN   NOT  MATCHED  THEN
             INSERT  (t1.lz_code,t1.cn_name,t1.data_date,t1.data_value,t1.create_time,t1.update_time)
             VALUES  (t2.lz_code,t2.cn_name,t2.data_date,t2.data_value,t2.create_time,t2.update_time)
    </insert>

selectKey查询返回当前序列

<insert id="insertModel" parameterType="com.mysteel.dataprocessing.lz.excel.parser.mapper.po.IndexDataModelPo">
        <selectKey order="BEFORE" resultType="java.lang.Integer" keyProperty="id" keyColumn="id">
            select LZ_HGVA_MODEL_MID_SEQ.nextval from dual
        </selectKey>
        INSERT INTO
        <include refid="tableName"/>
        (
        ID,PROJ_NAME, BREED_NAME, MODEL, CREATE_TIME, UPDATE_TIME
        ) values
        (
        #{id, jdbcType=INTEGER},
        #{projName, jdbcType=VARCHAR},
        #{breedName, jdbcType=VARCHAR},
        #{model, jdbcType=VARCHAR},
        #{createTime, jdbcType=BIGINT},
        #{updateTime, jdbcType=BIGINT}
        )
    </insert>

foreach标签方式

1w数据插入在9s左右

    <insert id="batchInsert" parameterType="java.util.List">
        INSERT INTO
        <include refid="tableName"/>
        (<include refid="insertColumn"/>)
        <foreach collection="list" index="index" item="item" separator="union all">
            (SELECT
            #{item.id, jdbcType=BIGINT},
            #{item.lzCode, jdbcType=VARCHAR},
            #{item.cnName, jdbcType=VARCHAR},
            #{item.dataDate, jdbcType=DATE},
            #{item.dataValue, jdbcType=VARCHAR},
            #{item.createTime, jdbcType=BIGINT},
            #{item.updateTime, jdbcType=BIGINT}
            FROM DUAL)
        </foreach>
    </insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序少年不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值