封面
:學校夜景
xdm计盒,祝大家節(jié)日快樂?势怠!????
今天聽《路過人間》演唱會Live限定版北启,愛上了一句歌詞卜朗。
說來慚愧拔第,人對愛只學會,視死如歸场钉。
1.業(yè)務需求
如下:
前臺傳給我一個 documentId
和List<UpdateDocumentAnswer>
對象給我蚊俺。
執(zhí)行條件:通過這個documentId
和List<UpdateDocumentAnswer>
中對UpdateDocumentAnswer.id
,修改document_answer
表的數(shù)據(jù)逛万。
簡單說:就是希望通過一條update語句泳猬,根據(jù)不同的條件改變多條需要改變的數(shù)據(jù)。
思考一:
我們先按照我們最簡單的思維思考:
即拆成一句一句執(zhí)行泣港,for循環(huán)執(zhí)行多條 update
語句暂殖。
update document_answer set where document_id=#{documentId} and id=#{answer.id}
這樣寫的話,我們的mapper層接收的參數(shù)当纱,應該為:
int patchByDocumentId(@Param("documentId") Long documentId,@Param("answers") UpdateDocumentAnswer answers);
實現(xiàn)是可以實現(xiàn)的呛每,但是因為需要執(zhí)行多條update語句,效率是真的不敢恭維坡氯。
如果大家有嘗試過晨横,都會知道,for循環(huán)執(zhí)行sql語句是真的要不得的箫柳。一條普通的sql手形,我們都要優(yōu)化完再優(yōu)化,更別說一個方法要執(zhí)行多條sql語句了悯恍。
所有就啥勒库糠??
推薦大家使用 百度涮毫、Bing瞬欧、Google進行搜索????
我們想到過這種問題,大概率別人也會遇上的罢防,搜一搜艘虎,確實有答案低。
所以我們接著進入思考二吧咒吐。??
思考二:
還記得文章前面所說:就是希望通過一條update語句野建,根據(jù)不同的條件改變多條需要改變的數(shù)據(jù)。
我們直接 搜怎么一條update用不同條件修改多條數(shù)據(jù)勒
就是會搜到一個下面的這樣的sql語句恬叹。
update 表名 set
列1=
case
when 條件1 then 值1
when 條件2 then 值2 end,
列2=
case
when 條件1 then 值1
when 條件2 then 值2 end,
where 條件
說實話候生,看到這條語句的那一刻,感覺自己又沒有學過mysql了妄呕,連crud工程師都算不上(捂臉)陶舞。
解釋:
我們要 修改列1, 當when 條件1 滿足時绪励,則將 列1 修改為 then 后面跟著的 值1肿孵,when 條件2 滿足,則將列1修改為then 后面跟著的值2疏魏。
這樣一樣停做,我們就可以執(zhí)行多條語句了啊。
2.實現(xiàn)
我們將之前的mapper層的接口傳入的參數(shù)做一下更改大莫。
int patchByDocumentId(@Param("documentId") Long documentId,@Param("answers") List<UpdateDocumentAnswer> answers);
mapper.xml的實現(xiàn)如下:
<update id="patchByDocumentId">
update document_answer
<set>
<trim prefix="template_question_id = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.templateQuestionId != null">
when id=#{answer.id} then #{answer.templateQuestionId}
</if>
</foreach>
</trim>
<trim prefix="answer = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.answer != null">
when id=#{answer.id} then #{answer.answer}
</if>
</foreach>
</trim>
<trim prefix="comments = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.comments != null">
when id=#{answer.id} then #{answer.comments}
</if>
</foreach>
</trim>
</set>
<where>
document_id=#{documentId}
<if test="answers != null">
and id in
<foreach collection="answers" separator="," item="answer" open="(" close=")">
#{answer.id}
</foreach>
</if>
</where>
</update>
生成的sql日志
update document_answer
SET
template_question_id =
case
when id=? then ?
when id=? then ? end,
answer =
case
when id=? then ?
when id=? then ? end,
comments =
case
when id=? then ?
when id=? then ? end
WHERE document_id=? and id in ( ? , ? )
換上我們想要的值:
update document_answer
SET
template_question_id =
case
when id=1 then 2
when id=1 then 3 end,
answer =
case
when id=1 then '內(nèi)容1'
when id=2 then '內(nèi)容2' end,
comments =
case
when id=1 then '評論1'
when id=2 then '評論2' end
WHERE document_id=2 and id in ( 1 , 2 )
執(zhí)行規(guī)則: 上面這種方式蛉腌,更新的記錄的數(shù)量取決于list集合的數(shù)量,且每條記錄中的值和對應記錄的ID是一一對應的只厘。
結(jié)束了烙丛,周日更文一篇。
后語
我們一起加油吧
你好羔味,我是博主
寧在春
:主頁希望本篇文章能讓你感到有所收獲:友省!赋元!
祝
我們:待別日相見時忘蟹,都已有所成
。歡迎大家一起討論問題??搁凸,躺了??