美文网首页
mybatis实现一条SQL批量保存和更新

mybatis实现一条SQL批量保存和更新

作者: Nisus_Liu | 来源:发表于2018-01-18 02:55 被阅读0次

    关键是mapper.xml的SQL语句映射配置

    批量保存(一条SQL)

    批量插入的SQL语句:

    insert into table (aa,bb,cc) values(xx,xx,xx),(oo,oo,oo)
    
    <!-- 批量插入数据 -->
        <insert id="insertBatch" parameterType="java.util.List"
            useGeneratedKeys="true">
            <selectKey resultType="long" keyProperty="id" order="AFTER">
                SELECT
                LAST_INSERT_ID()
            </selectKey>
            insert into wd_solr
            (fayu_id, tablename,
            name,logo,description,section_no,look_count,favorite_count,create_uid,create_time,update_time,timestamp)
            values
            <foreach collection="list" item="wdSolr" index="index"
                separator=",">
                (
                #{wdSolr.fayuId},#{wdSolr.tablename},#{wdSolr.name},#{wdSolr.logo},
                #{wdSolr.description},#{wdSolr.sectionNo},#{wdSolr.lookCount},#{wdSolr.favoriteCount},
                #{wdSolr.createUid},#{wdSolr.createTime},#{wdSolr.updateTime},#{wdSolr.timestamp}
                )
            </foreach>
        </insert>
    

    批量更新(一条SQL)

     <!--
        批量更新  一条SQL搞定
        updateInBatchAndSelectiveById-->
        <update id="updateInBatchAndSelectiveById" parameterType="list">
            update orders
            <trim prefix="set" suffixOverrides=",">
                <trim prefix="user_id =case" suffix="end,">
                    <foreach collection="list" item="i" index="index">
                        <if test="i.userId!=null">
                            when id=#{i.id} then #{i.userId}
                        </if>
                    </foreach>
                </trim>
                <trim prefix=" number =case" suffix="end,">
                    <foreach collection="list" item="i" index="index">
                        <if test="i.number!=null">
                            when id=#{i.id} then #{i.number}
                        </if>
                    </foreach>
                </trim>
    
                <trim prefix="createtime =case" suffix="end," >
                    <foreach collection="list" item="i" index="index">
                        <if test="i.createtime!=null">
                            when id=#{i.id} then #{i.createtime}
                        </if>
                    </foreach>
                </trim>
                <trim prefix="note =case" suffix="end," >
                    <foreach collection="list" item="i" index="index">
                        <if test="i.note!=null">
                            when id=#{i.id} then #{i.note}
                        </if>
                    </foreach>
                </trim>
            </trim>
            where
            <foreach collection="list" separator="or" item="i" index="index" >
                id=#{i.id}
            </foreach>
        </update>
    

    一条记录update一次,性能比较差,容易造成阻塞。

    MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

    UPDATE course
        SET name = CASE id 
            WHEN 1 THEN 'name1'
            WHEN 2 THEN 'name2'
            WHEN 3 THEN 'name3'
        END, 
        title = CASE id 
            WHEN 1 THEN 'New Title 1'
            WHEN 2 THEN 'New Title 2'
            WHEN 3 THEN 'New Title 3'
        END
    WHERE id IN (1,2,3)
    

    相关文章

      网友评论

          本文标题:mybatis实现一条SQL批量保存和更新

          本文链接:https://www.haomeiwen.com/subject/kdwpoxtx.html