首頁 > 軟體

mybatis如何批次修改資料

2022-03-14 13:00:53

批次修改主要有兩種方式

第一種

可以通過for迴圈一條一條修改資料,這樣會影響效率,因此我不推薦,所以在這裡我也不多說。

第二種

通過修改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批次更新資料update

mysql批次更新update

使用case when語句,資料表如下:

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的設定age欄位,id為2的設定為1,3的設定為2,結果為:

Column ‘age’ cannot be null.

原因是由於id=4沒有被上面的when匹配到,因此會被預設設為空null。即未被匹配到的記錄並不會保持原來的數值,而是會被設定為null。

case2:

如果想設預設值,可寫為:

update test1
set age=case
when id=2 then 1
when id =3 then 2
else 30
end
where id in (2,3,4)

結果是

可見id=4的設為了30,也就是通過else default_value可以對未被匹配到的行設定預設值。

case3:

如果想對未匹配到的行設定未原來的值,則可寫為:

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實現批次更新update

對應上面的各種case,來寫xml。

通常在寫程式碼的時候,有時候不更新的欄位就不會設定到物件裡,比如Person物件分別有id,name,age三個屬性對應資料庫的三個欄位,如果不想更新id=4的age時,就通常不設定age的值,也就是age=null,這樣在case1裡,就會被誤設為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物件有三個,分別對應id=2,3,4,若不想更新4的age,而只想更新4的姓名,則id=4的person物件age就會被設為null,這樣傳入該sql時,id=4的資料不會被when匹配,而又沒有設定預設值,則原資料會被刪除並設為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>

該程式碼由於設定了else 30,因此會id=4的資料在不設定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,則保持資料庫原值。

補充:

更新多條資料同一欄位為同一值:

UPDATE test1 SET age=24 WHERE id in(2,3,4);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com