最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在

 更新時(shí)間:2022年08月18日 10:19:17   作者:Perna  
這篇文章主要介紹了mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在,具有很好的參考價(jià)值,希望對(duì)的有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

批量添加,批量更新之前判斷是否已經(jīng)存在

批量添加之前判斷是否已經(jīng)存在,foreach  separator用UNION ALL。

批量修改

批量更新update詳解文檔

1 更新單條記錄

UPDATE course SET name = ‘course1' WHEREid = ‘id1';

2 更新多條記錄的同一個(gè)字段為同一個(gè)值

UPDATE course SET name=‘course1' WHERE id in(‘id1',‘id2','id3);

3 更新多條記錄為多個(gè)字段為不同的值

比較普通的寫法,是通過(guò)循環(huán),依次執(zhí)行update語(yǔ)句。

Mybatis寫法如下:

<update id="updateBatch" ?parameterType="java.util.List"> ?
? ? <foreach collection="list" item="item" index="index" open="" close="" separator=";">
? ? ? ? update course
? ? ? ? <set>
? ? ? ? ? ? name=${item.name}
? ? ? ? </set>
? ? ? ? where id = ${item.id}
? ? </foreach> ? ? ?
</update>

一條記錄update一次,性能比較差,容易造成阻塞。

MySQL沒(méi)有提供直接的方法來(lái)實(shí)現(xiàn)批量更新,但可以使用case when語(yǔ)法來(lái)實(shí)現(xiàn)這個(gè)功能。

UPDATE course
? ? SET name = CASE id?
? ? ? ? WHEN 1 THEN 'name1'
? ? ? ? WHEN 2 THEN 'name2'
? ? ? ? WHEN 3 THEN 'name3'
? ? END,?
? ? title = CASE id?
? ? ? ? WHEN 1 THEN 'New Title 1'
? ? ? ? WHEN 2 THEN 'New Title 2'
? ? ? ? WHEN 3 THEN 'New Title 3'
? ? END
WHERE id IN (1,2,3)

這條sql的意思是,如果id為1,則name的值為name1,title的值為New Title1;依此類推。

在Mybatis中的配置則如下:

?<update id="updateBatch"parameterType="list">
? ? ? ? ? ? update course
? ? ? ? ? ? <trim prefix="set" suffixOverrides=",">
? ? ? ? ? ? ?<trim prefix="name=case" suffix="end,">
? ? ? ? ? ? ? ? ?<foreach collection="list" item="item" index="index">
? ? ? ? ? ? ? ? ? ? ? ? ?<if test="item.name!=null">
? ? ? ? ? ? ? ? ? ? ? ? ? when id=#{item.id} then #{item.name}
? ? ? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ?</foreach>
? ? ? ? ? ? ? </trim>
? ? ? ? ? ? ? <trim prefix="title =case" suffix="end,">
? ? ? ? ? ? ? ? ?<foreach collection="list" item="item" index="index">
? ? ? ? ? ? ? ? ? ? ? ? ?<if test="item.title!=null">
? ? ? ? ? ? ? ? ? ? ? ? ? when id=#{item.id} then #{item.title}
? ? ? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ?</foreach>
? ? ? ? ? ? ? </trim>
? ? ? ? ? ? ?</trim>
? ? ? ? ? ? where
? ? ? ? ? ? <foreach collection="list" separator="or" item="item" index="index">
? ? ? ? ? ? ? id=#{item.id}
? ? ? ? ? </foreach>
</update>

屬性說(shuō)明

  • 1.prefix,suffix 表示在trim標(biāo)簽包裹的部分的前面或者后面添加內(nèi)容
  • 2.如果同時(shí)有prefixOverrides,suffixOverrides 表示會(huì)用prefix,suffix覆蓋Overrides中的內(nèi)容。
  • 3.如果只有prefixOverrides,suffixOverrides 表示刪除開頭的或結(jié)尾的xxxOverides指定的內(nèi)容。

4 sql批量更新

看另外一個(gè)示例:

? ?<update id="updateBatch"parameterType="java.util.List">
? ? update mydata_table?
? ? set ?status=
? ? <foreach collection="list" item="item" index="index"?
? ? ? ? separator=" " open="case ID" close="end">
? ? ? ? when #{item.id} then #{item.status}
? ? </foreach>
? ? where id in
? ? <foreach collection="list" index="index" item="item"?
? ? ? ? separator="," open="(" close=")">
? ? ? ? #{item.id,jdbcType=BIGINT}
? ? </foreach>
?</update>

其中when…then…是sql中的"switch" 語(yǔ)法。這里借助mybatis的語(yǔ)法來(lái)拼湊成了批量更新的sql,上面的意思就是批量更新id在updateBatch參數(shù)所傳遞List中的數(shù)據(jù)的status字段。還可以使用實(shí)現(xiàn)同樣的功能,代碼如下:

<update id="updateBatch" parameterType="java.util.List">
? ? ? ? update mydata_table
? ? ? ? <trim prefix="set" suffixOverrides=",">
? ? ? ? ? ? <trim prefix="status =case" suffix="end,">
? ? ? ? ? ? ? ? <foreach collection="list" item="item" index="index">
? ? ? ? ? ? ? ? ? ? ?when id=#{item.id} then #{item.status}
? ? ? ? ? ? ? ? </foreach>
? ? ? ? ? ? </trim>
? ? ? ? </trim>
? ? ? ? where id in
? ? ? ? <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
? ? ? ? ? ? #{item.id,jdbcType=BIGINT}
? ? ? ? </foreach>
</update>

其結(jié)構(gòu)如下:

? ? update mydata_table?
? ? set status =?
? ? case
? ? ? ? when id = #{item.id} then #{item.status}//此處應(yīng)該是<foreach>展開值
? ? ? ? ...
? ? end
? ? where id in (...);

如果對(duì)要更新的數(shù)據(jù)進(jìn)行判斷,只有符合條件的數(shù)據(jù)才能進(jìn)行更新,這種情況可以這么做:

<trim prefix="status =case" suffix="end,">
? ? ?<foreach collection="list" item="item" index="index">
? ? ? ? ?<if test="item.status !=null and item.status != -1">
? ? ? ? ? ? ?when id=#{item.id} then #{item.status}
? ? ? ? ?</if>
? ? ?</foreach>
</trim>

這樣的話只有要更新的list中status != null && status != -1的數(shù)據(jù)才能進(jìn)行status更新.其他的將使用默認(rèn)值更新,而不會(huì)保持原數(shù)據(jù)不變.如果要保持原數(shù)據(jù)不變呢?

即滿足條件的更新,不滿足條件的保持原數(shù)據(jù)不變,簡(jiǎn)單的來(lái)做就是再加一個(gè),因?yàn)閙ybatis中沒(méi)有if…else…語(yǔ)法,但可以通過(guò)多個(gè)實(shí)現(xiàn)同樣的效果,如下:

<trim prefix="status =case" suffix="end,">
? ? ?<foreach collection="list" item="item" index="index">
? ? ? ? ?<if test="item.status !=null and item.status != -1">
? ? ? ? ? ? ?when id=#{item.id} then #{item.status}
? ? ? ? ?</if>
? ? ? ? ?<if test="item.status == null or item.status == -1">
? ? ? ? ? ? ?when id=#{item.id} then mydata_table.status ? ? ?//這里就是原數(shù)據(jù)
? ? ? ? ?</if>
? ? ?</foreach>
</trim>

整體批量更新的寫法如下:

<update id="updateBatch"parameterType="java.util.List">
? ? ? ? update mydata_table
? ? ? ? <trim prefix="set" suffixOverrides=",">
? ? ? ? ? ? <trim prefix="status =case" suffix="end,">
? ? ? ? ? ? ? ? ?<foreach collection="list" item="item" index="index">
? ? ? ? ? ? ? ? ? ? ?<if test="item.status !=null and item.status != -1">
? ? ? ? ? ? ? ? ? ? ? ? ?when id=#{item.id} then #{item.status}
? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ? ? ?<if test="item.status == null or item.status == -1">
? ? ? ? ? ? ? ? ? ? ? ? ?when id=#{item.id} then mydata_table.status//原數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ?</foreach>
? ? ? ? ? ? </trim>
? ? ? ? </trim>
? ? ? ? where id in
? ? ? ? <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
? ? ? ? ? ? #{item.id,jdbcType=BIGINT}
? ? ? ? </foreach>
</update>

1.組裝多個(gè)update語(yǔ)句,這種方式需要設(shè)置jdbc連接 allowMultiQueries=true

? ?<update id="updateEquementWaterTest" ? parameterType="java.util.List">
?? ? ? ? <foreach collection="list" item="item" index="index">
?? ??? ??? ??? ? ? ? ? ? ??? ?update rent_hl_room l
?? ??? ??? ??? ?SET l.water_meter_id=#{item.equipmentCode},
?? ??? ??? ??? ?l.water_meter_source_type=#{item.equipmentSource}
?? ??? ??? ??? ?WHERE?
?? ??? ??? ??? ? ? ?l.room_id=#{item.roomId};
? ? ?? ??? ? </foreach>
? ? ?</update>

2.case when

UPDATE?
? rent_hl_room l?
SET
? electricity_meter_id =?
? CASE
? ? WHEN room_id = 1942
? ? THEN 180524348?
? ? WHEN room_id = 1945
? ? THEN 180524480?
? END,
? electricity_meter_source_type =?
? CASE
? ? WHEN room_id = 1942?
? ? THEN ym?
? ? WHEN room_id = 1945?
? ? THEN ym?
? END?
WHERE room_id = 1942?
? OR room_id = 1945?
? ? ? ? ? <update id="updateEquementWater" ? parameterType="java.util.List">
?? ? ? ? ? ? ?update rent_hl_room l
? ? ? ? ? ? <trim prefix="set" suffixOverrides=",">
? ? ? ? ? ? ?<trim prefix="water_meter_id =case" suffix="end,">
? ? ? ? ? ? ? ? ?<foreach collection="list" item="i" index="index">
? ? ? ? ? ? ? ? ? ? ? ? ?<if test="i.equipmentCode!=null">
? ? ? ? ? ? ? ? ? ? ? ? ? when room_id=#{i.roomId} then #{i.equipmentCode}
? ? ? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ?</foreach>
? ? ? ? ? ? ? </trim>
? ? ? ? ? ? ? <trim prefix=" water_meter_source_type =case" suffix="end,">
? ? ? ? ? ? ? ? ?<foreach collection="list" item="i" index="index">
? ? ? ? ? ? ? ? ? ? ? ? ?<if test="i.equipmentSource!=null">
? ? ? ? ? ? ? ? ? ? ? ? ? when room_id=#{i.roomId} then #{i.equipmentSource}
? ? ? ? ? ? ? ? ? ? ? ? ?</if>
? ? ? ? ? ? ? ? ?</foreach>
? ? ? ? ? ? ? </trim>
? ? ? ? ? ? ?</trim>
? ? ? ? ? ? where
? ? ? ? ? ? <foreach collection="list" separator="or" item="i" index="index" >
? ? ? ? ? ? ? room_id=#{i.roomId}
? ? ? ? ? </foreach>
?? ? ? ?
? ? ? ?</update>

經(jīng)測(cè)試 100條數(shù)據(jù)的時(shí)候第一種方式的效率比第二種差不多高1倍。。。。。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring源碼解析之Configuration

    Spring源碼解析之Configuration

    今天帶大家來(lái)學(xué)習(xí)Java Spring相關(guān)知識(shí),文中對(duì)Configuration源碼介紹的非常詳細(xì),有非常多的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java中Vector、ArrayList、LinkedList的關(guān)系詳細(xì)解析

    Java中Vector、ArrayList、LinkedList的關(guān)系詳細(xì)解析

    這篇文章主要介紹了Java中Vector、ArrayList、LinkedList的關(guān)系詳細(xì)解析,Vector和ArrayList底層均為Object數(shù)組,LinkedList底層是Node節(jié)點(diǎn),Vector是線程安全(底層方法均添加synchronized),ArrayList、LinkedList是線程不安全(無(wú)鎖),需要的朋友可以參考下
    2023-11-11
  • 記一次springboot服務(wù)凌晨無(wú)故宕機(jī)問(wèn)題的解決

    記一次springboot服務(wù)凌晨無(wú)故宕機(jī)問(wèn)題的解決

    這篇文章主要介紹了記一次springboot服務(wù)凌晨無(wú)故宕機(jī)問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Sparsearray稀疏數(shù)組原理及實(shí)例詳解

    Sparsearray稀疏數(shù)組原理及實(shí)例詳解

    這篇文章主要介紹了Sparsearray稀疏數(shù)組原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分析

    java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分析

    這篇文章主要介紹了java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Maven的安裝和環(huán)境變量配置過(guò)程

    Maven的安裝和環(huán)境變量配置過(guò)程

    文章介紹了如何下載、安裝和配置Maven,包括環(huán)境變量配置和阿里云鏡像的可選配置,此外,還展示了如何在IntelliJ IDEA中新建一個(gè)Maven項(xiàng)目
    2024-11-11
  • 詳解用Spring Boot Admin來(lái)監(jiān)控我們的微服務(wù)

    詳解用Spring Boot Admin來(lái)監(jiān)控我們的微服務(wù)

    這篇文章主要介紹了用Spring Boot Admin來(lái)監(jiān)控我們的微服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java Socket聊天室編程(二)之利用socket實(shí)現(xiàn)單聊聊天室

    Java Socket聊天室編程(二)之利用socket實(shí)現(xiàn)單聊聊天室

    這篇文章主要介紹了Java Socket聊天室編程(二)之利用socket實(shí)現(xiàn)單聊聊天室的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 淺談java面向?qū)ο蟮臄?shù)組化信息處理

    淺談java面向?qū)ο蟮臄?shù)組化信息處理

    下面小編就為大家?guī)?lái)一篇淺談java面向?qū)ο蟮臄?shù)組化信息處理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 解決dubbo錯(cuò)誤ip及ip亂入問(wèn)題的方法

    解決dubbo錯(cuò)誤ip及ip亂入問(wèn)題的方法

    今天小編就為大家分享一篇關(guān)于解決dubbo錯(cuò)誤ip及ip亂入問(wèn)題的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03

最新評(píng)論

裕民县| 无锡市| 府谷县| 林西县| 呼伦贝尔市| 手机| 奉贤区| 晴隆县| 宁陕县| 九龙城区| 长泰县| 平邑县| 临澧县| 得荣县| 灌南县| 黄平县| 大新县| 陈巴尔虎旗| 务川| 卢氏县| 确山县| 聂拉木县| 年辖:市辖区| 万宁市| 安顺市| 洮南市| 营口市| 卫辉市| 威信县| 扎鲁特旗| 敦煌市| 彩票| 牟定县| 武穴市| 文成县| 栾城县| 六枝特区| 武义县| 石门县| 正宁县| 玛纳斯县|