前言
我们在开发过程中可能会碰到一些批量更新的场景,如果循环逐条更新不仅效率低,还可能造成数据库锁表,因此为了减少jdbc操作在业务中可以使用批量更新来解决,以下是我项目中的实战总结,单次批量更新数据量3.6W+ 条没任何问题;
方案一
入参为List,适用于小数据量做批量更新(数据量过大报sql拼接过长错误 )
1、mapper
/**
* 批量更新管理信息表部分字段
* @param ectx0002List
*/
void updateManageForeach(List<ECTX0002>ectx0002List);
2、xml
注:字段需要对应数据类型
<update id="updateManageForeach" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update EM_ENTPRISE_MANAGE
set
BELONG_CODE=#{item.attributeCode,jdbcType=VARCHAR},
BELONG_REGION=#{item.attribute,jdbcType=VARCHAR},
BELONG_BUSINESS=#{item.economicsType,jdbcType=VARCHAR},
TAX_ORG=#{item.farewell,jdbcType=VARCHAR},
TAX_RULER=#{item.specialController,jdbcType=VARCHAR}
where ENTPRISE_ID=#{item.entpriseId}
</foreach>
</update>
方案二(推荐使用)
根据入参在update方法中关联查询再更新,减少jdbc操作次数,一次链接解决查询、更新,且支持大数据量更新;
1、mapper
/**
* 批量更新管理信息表部分字段
* @param batchNo
*/
void updateManageBatchOther(String batchNo);
2、xml
<update id="updateManageBatchOther">
UPDATE EM_ENTPRISE_MANAGE manage
INNER JOIN (
SELECT
ENTPRISE_ID,
ATTRIBUTE_CODE,
ATTRIBUTE,
ECONOMICS_TYPE,
FAREWELL,
SPECIAL_CONTROLLER
FROM zszx.TEAM_STREAM_TAX_CURSOR
WHERE BATCH_NO = #{batchNo} AND ENABLED = 1 AND REMOVED = 0
) tax ON tax.ENTPRISE_ID = manage.ENTPRISE_ID
SET
manage.BELONG_CODE = tax.ATTRIBUTE_CODE,
manage.BELONG_REGION = tax.ATTRIBUTE,
manage.BELONG_BUSINESS = tax.ECONOMICS_TYPE,
manage.TAX_ORG = tax.FAREWELL,
manage.TAX_RULER = tax.SPECIAL_CONTROLLER
</update>