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

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

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

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

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

批量修改

批量更新update詳解文檔

1 更新單條記錄

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

2 更新多條記錄的同一個字段為同一個值

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

3 更新多條記錄為多個字段為不同的值

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

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沒有提供直接的方法來實現(xiàn)批量更新,但可以使用case when語法來實現(xiàn)這個功能。

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>

屬性說明

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

4 sql批量更新

看另外一個示例:

? ?<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" 語法。這里借助mybatis的語法來拼湊成了批量更新的sql,上面的意思就是批量更新id在updateBatch參數(shù)所傳遞List中的數(shù)據(jù)的status字段。還可以使用實現(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 (...);

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

<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ù)才能進行status更新.其他的將使用默認(rèn)值更新,而不會保持原數(shù)據(jù)不變.如果要保持原數(shù)據(jù)不變呢?

即滿足條件的更新,不滿足條件的保持原數(shù)據(jù)不變,簡單的來做就是再加一個,因為mybatis中沒有if…else…語法,但可以通過多個實現(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.組裝多個update語句,這種方式需要設(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)測試 100條數(shù)據(jù)的時候第一種方式的效率比第二種差不多高1倍。。。。。

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

相關(guān)文章

  • Spring源碼解析之Configuration

    Spring源碼解析之Configuration

    今天帶大家來學(xué)習(xí)Java Spring相關(guān)知識,文中對Configuration源碼介紹的非常詳細(xì),有非常多的圖文解說及代碼示例,對正在學(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é)點,Vector是線程安全(底層方法均添加synchronized),ArrayList、LinkedList是線程不安全(無鎖),需要的朋友可以參考下
    2023-11-11
  • 記一次springboot服務(wù)凌晨無故宕機問題的解決

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    解決dubbo錯誤ip及ip亂入問題的方法

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

最新評論

翼城县| 兴化市| 怀仁县| 西乌珠穆沁旗| 茂名市| 焦作市| 南通市| 曲周县| 惠州市| 平南县| 龙井市| 温泉县| 全南县| 颍上县| 广东省| 涟源市| 武平县| 高淳县| 长乐市| 桃园县| 临洮县| 山丹县| 都兰县| 南木林县| 民丰县| 类乌齐县| 崇阳县| 沛县| 云梦县| 西平县| 司法| 克东县| 孟连| 厦门市| 丹凤县| 孟州市| 巫山县| 金川县| 古蔺县| 绥德县| 根河市|