mybatis如何批量修改數(shù)據(jù)
批量修改主要有兩種方式
第一種
可以通過for循環(huán)一條一條修改數(shù)據(jù),這樣會影響效率,因此我不推薦,所以在這里我也不多說。
第二種
通過修改mybatis中mapper.xml文件,如下:
<update id="updateRoleMenus" parameterType="java.util.List">? ? ? ? <foreach collection="list" item="item" index="index" open="" close="" separator=";">? ? ? ? ?update TB_ROLE_MENU ? ? ? ? ? ? <set>? ? ? ? ? ? FID=#{item.fid} ? ? ? ? ? </set>? ? ? ? ? ? where ROLEID = #{item.roleid}? ? ? ? </foreach>? ? ? </update>
mysql及mybatis批量更新數(shù)據(jù)update
mysql批量更新update
使用case when語句,數(shù)據(jù)表如下:
case1:
其中age為非空字段。sql如下
update test1 set age=case when id=2 then 1 when id =3 then 2 end where id in (2,3,4)
對id為2,3,4的設(shè)置age字段,id為2的設(shè)置為1,3的設(shè)置為2,結(jié)果為:
Column ‘age’ cannot be null.
原因是由于id=4沒有被上面的when匹配到,因此會被默認設(shè)為空null。即未被匹配到的記錄并不會保持原來的數(shù)值,而是會被設(shè)置為null。
case2:
如果想設(shè)默認值,可寫為:
update test1 set age=case when id=2 then 1 when id =3 then 2 else 30 end where id in (2,3,4)
結(jié)果是
可見id=4的設(shè)為了30,也就是通過else default_value可以對未被匹配到的行設(shè)置默認值。
case3:
如果想對未匹配到的行設(shè)置未原來的值,則可寫為:
update test1 set age=case when id=2 then 1 when id =3 then 2 when id =4 then test1.age end where id in (2,3,4)
這樣就可以通過test1.age來使id=4的行保持原值。在mybatis中可看到這種寫法的用處。
mybatis實現(xiàn)批量更新update
對應(yīng)上面的各種case,來寫xml。
通常在寫代碼的時候,有時候不更新的字段就不會設(shè)置到對象里,比如Person對象分別有id,name,age三個屬性對應(yīng)數(shù)據(jù)庫的三個字段,如果不想更新id=4的age時,就通常不設(shè)置age的值,也就是age=null,這樣在case1里,就會被誤設(shè)為null,詳細見如下代碼。
case1:
update test1 <set> <trim prefix="age=case" suffix="end,"> <foreach collection="list" item="item" index="index"> <if test="item.age !=null"> when id=#{item.id} then #{item.age} </if> </foreach> </trim> <trim prefix="name=case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.name} </foreach> </trim> </set> where id in <foreach collection="list" item="item" index="index" separator="," open="(" close=")"> #{item.id} </foreach>
當傳入的list中person對象有三個,分別對應(yīng)id=2,3,4,若不想更新4的age,而只想更新4的姓名,則id=4的person對象age就會被設(shè)為null,這樣傳入該sql時,id=4的數(shù)據(jù)不會被when匹配,而又沒有設(shè)置默認值,則原數(shù)據(jù)會被刪除并設(shè)為null。
case2:
update test1 <set> <trim prefix="age=case" suffix="end,"> <foreach collection="list" item="item" index="index"> <if test="item.age !=null"> when id=#{item.id} then #{item.age} </if> </foreach> else 30 </trim> <trim prefix="name=case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.name} </foreach> </trim> </set> where id in <foreach collection="list" item="item" index="index" separator="," open="(" close=")"> #{item.id} </foreach>
該代碼由于設(shè)置了else 30,因此會id=4的數(shù)據(jù)在不設(shè)置age的情況下會被更新為30。
case3:
update test1 <set> <trim prefix="age=case" suffix="end,"> <foreach collection="list" item="item" index="index"> <if test="item.age !=null"> when id=#{item.id} then #{item.age} </if> <if test="item.age ==null"> when id=#{item.id} then test1.age </if> </foreach> </trim> <trim prefix="name=case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.name} </foreach> </trim> </set> where id in <foreach collection="list" item="item" index="index" separator="," open="(" close=")"> #{item.id} </foreach>
通過if標簽,若傳入的屬性為null,則保持數(shù)據(jù)庫原值。
補充:
更新多條數(shù)據(jù)同一字段為同一值:
UPDATE test1 SET age=24 WHERE id in(2,3,4);
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java8 stream 操作map根據(jù)key或者value排序的實現(xiàn)
這篇文章主要介紹了java8 stream 操作map根據(jù)key或者value排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程
這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01