【MyBatis批量更新实现】按照list传入批量更新
学习目标:
<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接口
public interface ModelEngineeringSpatialNodeMapper {int updateBatchModelEngineeringSpatialNode(@Param("list") List<ModelEngineeringSpatialNode> modelEngineeringSpatialNode);
}
XML映射文件
<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条数据作为一个批次:
/*** 批量节点更新** @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;}