學習目標:
<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;}