小弟昨日一個需求,就是講一個list集合 update到一張表中,但與insert的寫法不一樣。須要將list封裝成map 在傳入xml中進行foreachjava
<update id="updateYesterdayAmountBatch" parameterType="java.util.Map"> update debt_current_user_holding_temp dcu set dcu.yesterday_amount = <foreach collection="tt" item="debtCurrentUserHoldingTemp" index="index" separator=" " open="case id" close="end,"> when #{debtCurrentUserHoldingTemp.id} then #{debtCurrentUserHoldingTemp.yesterdayAmount} </foreach> dcu.amount = <foreach collection="tt" item="debtCurrentUserHoldingTemp" index="index" separator=" " open="case id" close="end,"> when #{debtCurrentUserHoldingTemp.id} then #{debtCurrentUserHoldingTemp.amount} </foreach> dcu.updated_at = <foreach collection="tt" item="debtCurrentUserHoldingTemp" index="index" separator=" " open="case id" close="end"> when #{debtCurrentUserHoldingTemp.id} then #{debtCurrentUserHoldingTemp.updatedAt} </foreach> where dcu.id in <foreach collection="tt" index="index" item="debtCurrentUserHoldingTemp" separator="," open="(" close=")"> #{debtCurrentUserHoldingTemp.id} </foreach> </update>
這裏要注意,set 後面跟的字段,要將open設置成 case id close = 「end」,而where條件要使用in 緣由是mybatis在解析時,會將其條件in(1,2,3)等等。而set 後面的字段 會解析成 case id when xx then x when xxx then xxx end,下一個字段,最後一個字段是end 沒有逗號。mybatis
int updateYesterdayAmountBatch(Map<String, Object> tt);
上述是 mapper中的內容。這樣就能實現mybatis的批量更新。緣由是mybatis默認會將list類型的參數自動封裝成map 而且key= list,vaue 就是集合。但是有時候直接傳入list也是能夠的。不知道爲何。按照個人寫法。若是直接傳入list參數 ,會報錯,parameter xxx not found。也不知是哪裏的問題。後續研究出來接着補充。app
insert 使用list做爲參數就能直接識別。。爲啥update 必需要map呢?待小弟去研究一下mybatis文檔再議。code