学习目标:
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;
}