【MyBatis批量更新实现】按照list传入批量更新

学习目标:

java 复制代码
<update id="updateModelEngineeringSpatialNode" parameterType="com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">
        update model_engineering_spatial_node
        <trim prefix="SET" suffixOverrides=",">
            <if test="adcd != null">adcd = #{adcd},</if>
        </trim>
        where snode_id = #{snodeId}
    </update>

将上面的这个mybatis的sql改写成按照list进行批量更新,应该如何实现呢?

public int updateBatchModelEngineeringSpatialNode(@Param("list") List modelEngineeringSpatialNode);

学习内容:

要将单个更新改为批量更新,可以使用MyBatis的标签。以下是完整的实现代码:

Mapper接口

java 复制代码
public interface ModelEngineeringSpatialNodeMapper {
    int updateBatchModelEngineeringSpatialNode(@Param("list") List<ModelEngineeringSpatialNode> modelEngineeringSpatialNode);
}

XML映射文件

java 复制代码
<update id="updateBatchModelEngineeringSpatialNode" parameterType="list">
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update model_engineering_spatial_node
        <trim prefix="SET" suffixOverrides=",">
            <if test="item.adcd != null">adcd = #{item.adcd},</if>
        </trim>
        where snode_id = #{item.snodeId}
    </foreach>
</update>

注意事项:

这种批量更新方式实际上是发送多条单独的UPDATE语句,但在一个数据库会话中执行

需要在JDBC连接URL中添加allowMultiQueries=true参数以支持多条SQL语句执行

如果列表很大,可能需要分批处理以避免性能问题

数据量大分批执行:

ServiceImpl模块进行分批执行,数据量较大时,每1000条数据作为一个批次:

java 复制代码
/**
     * 批量节点更新
     *
     * @param list 需要更新的节点list
     * @return 结果
     */
    public int updateBatchModelEngineeringSpatialNode(List<ModelEngineeringSpatialNode> list)
    {
        //由于数据库对于插入字段的限制,在这里对批量插入的数据进行分批处理
        int num = 0;
        int batchCount = 1000;
        for (int i = 0; i < list.size(); i += batchCount) {
            int end = Math.min(i + batchCount, list.size());
            num += modelEngineeringSpatialNodeMapper.updateBatchModelEngineeringSpatialNode(list.subList(i, end));
        }

        return num;
    }