在日常開發中,有時候會遇到批量更新操作,這時候最普通的寫法就是循環遍歷,然后一條一條地進行update操作。但是不管是在服務端進行遍歷,還是在sql代碼中進行遍歷,都很耗費資源,而且性能比較差,容易造成阻塞。
Mysql沒有提供直接的方法來實現批量更新,但可以使用case when語法來實現這個功能。
Mysql中代碼示例:
UPDATE tablename SET sort = CASE id WHEN 1 THEN 'sort1' WHEN 2 THEN 'sort2' WHEN 3 THEN 'sort3' END, updateuserid = CASE id WHEN 1 THEN 'updateuserid1' WHEN 2 THEN 'updateuserid2' WHEN 3 THEN 'updateuserid3' END WHERE id IN (1,2,3)
sql釋義:
如果id為1,則sort的值為sort1,updateuserid的值為updateuserid1;
如果id為2,則sort的值為sort2,updateuserid的值為updateuserid2;
如果id為3,則sort的值為sort3,updateuserid的值為updateuserid3;以此類推。
Mybatis中代碼示例:
<update id="updateBatch" parameterType="list"> update t_mt_sm_dept <trim prefix="set" suffixOverrides=","> <trim prefix=" sort = case" suffix="end,"> <foreach collection="list" item="i" index="index"> <if test="sort != '' and sort != null"> when id=#{i.id} then #{i.sort} </if> </foreach> </trim> <trim prefix="updateuserid = case" suffix="end,"> <foreach collection="list" item="i" index="index"> <if test="updateuserid != '' and updateuserid != null"> when id=#{i.id} then #{i.updateuserid} </if> </foreach> </trim> <trim prefix="updateusername = case" suffix="end,"> <foreach collection="list" item="i" index="index"> <if test="updateusername != '' and updateuserid != null"> when id=#{i.id} then #{i.updateusername} </if> </foreach> </trim> </trim> where <foreach collection="list" separator="or" item="i" index="index"> id = #{i.id} </foreach> </update>
java中代碼:
/** * 批量修改排序 */ int updateBatch(List<SmDept> smDeptList);