Mybatis 的sql语句 关于批量插入和批量更新

本文介绍如何使用MyBatis实现数据批量更新,通过案例解析批量更新SQL语句的编写技巧,包括使用case when语句和trim标签优化代码,适用于需要高效处理大量数据更新的场景。

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

 

最近在用java写后端接口时,遇到数据的批量更新问题,显而易见,写个for循环进行更新是最方便的,但是影响效率,显然需要更好的解决办法,想起了经常写的批量插入操作,试了一下,发现不能用同样的办法,查了会资料,终于写完了批量更新的sql语句。

先附上较容易的批量插入的代码:

<insert id="addAllLiquidityKey" parameterType="java.util.List">
     insert into liquidity_key(responsible_department,item_name,responsible_person,collaborative_department,measure,date)
    values
    <foreach collection="list" item="liquidityKey" separator=",">
    (#{liquidityKey.responsibleDepartment},#{liquidityKey.itemName},#{liquidityKey.responsiblePerson},#{liquidityKey.collaborativeDepartment},#{liquidityKey.measure},#{liquidityKey.date})
    </foreach>
</insert>

然后是批量更新的sql:

(先附上网上找的一个)

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="status =case" suffix="end,">
                 <foreach collection="list" item="item" index="index">
                     <if test="item.status !=null and item.status != -1">
                         when id=#{item.id} then #{item.status}
                     </if>
                     <if test="item.status == null or item.status == -1">
                         when id=#{item.id} then mydata_table.status//原数据
                     </if>
                 </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
    </update>

刚看到的时候有点懵,查了会sql语句,发现首先批量更新,需要用到

case when数据库操作语句(忘了的可以百度下)

然后了解一下trim标签的属性,

trim标签使用

1、trim 有四个属性
2、prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容(注意:是没有prefixOverrides,suffixOverrides的情况下)
3、如果有prefixOverrides,suffixOverrides 表示**覆盖**Overrides中的内容。
4、如果只有prefixOverrides,suffixOverrides 表示删除。

之后呢,就可以开始写批量更新的语句了,

附上我的代码,由于我的表字段有点多,需要些较多相同的代码,为了简便,写了个方法来引用:

 

sql id="batch_update">
    <trim prefix="${table_name} = case" suffix="end,">
        <foreach collection="list" item="item" index="index">
            <if test="item.${listName} != null">
                when id = #{item.id} then #{item.${listName}}
            </if>
            <if test="item.${listName} == null">
                when id = #{item.id} then liquidity_key.${table_name}
            </if>
        </foreach>
    </trim>
</sql>
    <update id="updateAll" parameterType="java.util.List">
          update liquidity_key
            <trim prefix="set" suffixOverrides=",">
                <include refid="batch_update">
                    <property name="table_name" value="responsible_department"/>
                    <property name="listName" value="responsibleDepartment"/>
                </include>
                <include refid="batch_update">
                    <property name="table_name" value="item_name"/>
                    <property name="listName" value="itemName"/>
                </include>
                <include refid="batch_update">
                    <property name="table_name" value="responsible_person"/>
                    <property name="listName" value="responsiblePerson"/>
                </include>
                <include refid="batch_update">
                    <property name="table_name" value="collaborative_department"/>
                    <property name="listName" value="collaborativeDepartment"/>
                </include>
                <include refid="batch_update">
                    <property name="table_name" value="measure"/>
                    <property name="listName" value="measure"/>
                </include>
                <include refid="batch_update">
                    <property name="table_name" value="date"/>
                    <property name="listName" value="date"/>
                </include>
            </trim>
            where id in
            <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
                #{item.id}
            </foreach>
    </update>

 

MyBatis批量操作主要是为了提高数据处理的效率,特别是当需要一次性更新插入大量记录时。它通过将一系列SQL语句组织成批处理(Batch Operation)的方式,减少了与数据库交互的次数,降低了网络开销。 1. **批量更新**:在 MyBatis 中,可以使用 `update` 者 `batch` 元素配合 `foreach` 进行批量更新。首先,在 XML 映射文件中定义一个包含 `update` 语句的元素,并设置 `parameterType` `resultType`。然后,使用 `foreach` 遍历一个 Java 对象列表,每个对象对应一条更新记录,生成多个 `UPDATE` 语句一起发送到数据库。 ```xml <update id="updateBatch" parameterType="java.util.List"> UPDATE table <set> <if test="field != null">field = #{field},</if> <!-- 条件判断 --> <!-- 可以添加更多字段... --> </set> WHERE id IN <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item.id} </foreach> </update> ``` 2. **批量插入**:类似地,使用 `insert` `foreach` 可以批量插入数据。XML 映射文件中的 `insert` 元素不需要 `resultType`,因为插入通常不会返回值。插入操作会将整个列表作为参数一次性发送到数据库: ```xml <insert id="insertBatch" parameterType="java.util.List"> INSERT INTO table (field1, field2, ...) VALUES <foreach item="item" index="index" collection="list" open="(" separator=")," close=")"> (#{item.field1}, #{item.field2}, ...), </foreach> </insert> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值