mybatis 批量新增insert、更新update詳解
1、批量更新
參考 https://blog.csdn.net/lu1024188315/article/details/78758943
1、更新單條記錄
UPDATE course SET name = 'course1' WHEREid = 'id1';
2、更新多條記錄的同一個欄位為同一個值
UPDATE course SET name='course1' WHERE id in('id1','id2','id3);
3、更新多條記錄為多個欄位為不同的值
比較普通的寫法,是通過迴圈,依次執行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沒有提供直接的方法來實現批量更新,但可以使用 case when
語法來實現這個功能。
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中的配置則如下:
<updateid="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>
< trim > 屬性說明
- prefix,suffix 表示在 trim 標籤包裹的部分的前面或者後面新增內容
- 如果同時有 prefixOverrides,suffixOverrides 表示會用 prefix,suffix 覆蓋 Overrides 中的內容。
- 如果只有 prefixOverrides,suffixOverrides 表示刪除開頭的或結尾的 xxxOverides 指定的內容。
如果 對要更新的資料進行判斷,只有符合條件的資料才能進行更新,這種情況可以這麼做:
<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 的資料才能進行 status 更新.其他的將使用預設值更新
,而 不會保持原資料不變
.如果要保持原資料不變呢?即滿足條件的更新,不滿足條件的保持原資料不變,簡單的來做就是再加一個 < if > ,因為 mybatis 中 沒有 if...else...
語法,但可以通過多個 < if > 實現同樣的效果
,如下:
<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 //這裡就是原資料
</if>
</foreach>
</trim>
非trim的另外一個示例:
<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 的 < foreach > 語法來拼湊成了批量更新的 sql ,上面的意思就是批量更新 id 在 updateBatch 引數所傳遞 List 中的資料的status 欄位。還可以使用 < 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">
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>
其結構如下:
update mydata_table
set status =
case
when id = #{item.id} then #{item.status}//此處應該是<foreach>展開值
...
end
where id in (...);
2、批量新增
批量插入sql:
insert table () values (),(),()
批量插入xml:
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO table (creat_time, modified_time, name, code)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(now(), now(),
#{item.name,jdbcType=INTEGER}, #{item.code,jdbcType=BIGINT})
</foreach>
</insert>
相關文章
- Mybatis批量更新SQL報錯☞解決辦法MyBatisSQL
- Mybatis批量更新三種方式MyBatis
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- oracle批量新增更新資料Oracle
- mybatis update並非所有欄位需要更新的解決辦法MyBatis
- mysql update join,insert select 語法MySql
- MySQL insert on duplicate key update 死鎖MySql
- insert批量插入優化方案優化
- 使用JDBC時,加速批量insertJDBC
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- Mybatis詳解MyBatis
- update-alternatives 使用詳解
- MyBatis(五) insert、update、delete 、主鍵回填、返回matched行數和affected行數、引數配置#{},${}MyBatisdelete
- sql server 帶有OUTPUT的INSERT,DELETE,UPDATESQLServerdelete
- BUG: pymysql executemany不支援insert on duplicate key updateMySql
- DBeaver如何生成select,update,delete,insert語句delete
- Oracle中 Update和insert結合語法Oracle
- Oracle批量插入資料insert all into用法Oracle
- MyBatis 配置詳解MyBatis
- MyBatis詳解(一)MyBatis
- Mybatis批量操作demoMyBatis
- 利用insert,update和delete注入獲取資料delete
- mysql 在delete、insert、update 時,page的變化MySqldelete
- MySQL 關於 INSERT INTO...ON DUPLICATE KEY UPDATE 的使用MySql
- KunlunDB功能之insert/update/delete...returning語句delete
- Mybatis快取詳解MyBatis快取
- MyBatis Generator 用法詳解MyBatis
- SQLServer批量更新SQLServer
- Laravel 批量更新Laravel
- 輕量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 語句ORMSQLdelete
- MyBatis(八):MyBatis外掛機制詳解MyBatis
- mysql同一個事務中update,insert導致死鎖問題分析解決MySql
- MyBatis特快取性詳解MyBatis快取
- SQL Server的Merge —— 一步實現 insert,update,deleteSQLServerdelete
- win10 windows update更新失敗怎麼解決 win10系統update更新失敗如何修復Win10Windows
- Mybatis新增&修改MyBatis
- indexedDB 批量新增資料Index
- 批量照片水印新增工具