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>
相關文章
- MySQL批量Insert應用ON DUPLICATE KEY UPDATEMySql
- MyBatis Batch Update Exception使用foreach批量update出錯MyBatisException
- Mybatis批量更新SQL報錯☞解決辦法MyBatisSQL
- Mybatis批量更新三種方式MyBatis
- oracle批量新增更新資料Oracle
- mybatis update並非所有欄位需要更新的解決辦法MyBatis
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- 【MyBatis原始碼分析】insert方法、update方法、delete方法處理流程(上篇)MyBatis原始碼delete
- 【MyBatis原始碼分析】insert方法、update方法、delete方法處理流程(下篇)MyBatis原始碼delete
- mysql INSERT ... ON DUPLICATE KEY UPDATEMySql
- Mybatis詳解MyBatis
- 索引是否也能提高UPDATE,DELETE,INSERT速度 解釋索引delete
- mybatis批量操作MyBatis
- Default Locking for INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE (351)delete
- MyBatis詳解(一)MyBatis
- MyBatis 配置詳解MyBatis
- 如何通過rownum對錶的不同範圍進行批量更新update
- insert into select 批量載入出錯解決方案
- MySQL insert on duplicate key update 死鎖MySql
- 34、VIEW可以insert,delete,update.Viewdelete
- insert批量插入優化方案優化
- 使用JDBC時,加速批量insertJDBC
- MySQL批量insert效率對比SQL
- JDBC批量Insert深度優化JDBC優化
- Mybatis批量操作demoMyBatis
- update-alternatives 使用詳解
- insert 中append 用法詳解APP
- Mybatis快取詳解MyBatis快取
- MyBatis Generator 用法詳解MyBatis
- Mybatis的使用詳解MyBatis
- MyBatis(五) insert、update、delete 、主鍵回填、返回matched行數和affected行數、引數配置#{},${}MyBatisdelete
- MongoDB更新(update)操作MongoDB
- mysql update join,insert select 語法MySql
- sql server merge 做insert和updateSQLServer
- mysql操作命令梳理(2)-alter(update、insert)MySql
- mysql innodb新建索引堵塞update ,insert,deleteMySql索引delete
- MyBatis(八):MyBatis外掛機制詳解MyBatis
- SQLServer批量更新SQLServer