點滴記載,點滴進步,願自己更上一層樓。
上節**了批量新增資料,這節**批量更新資料兩種寫法的效率問題。
實現方式有兩種,
一種用for迴圈通過迴圈傳過來的引數集合,迴圈出n條sql,
另一種 用mysql的case when 條件判斷變相的進行批量更新
下面進行實現。
注意第一種方法要想成功,需要在db鏈結url後面帶乙個引數 &allowmultiqueries=true
即: jdbc:mysql://localhost:3306/mysqltest?characterencoding=utf-8&allowmultiqueries=true
其實這種東西寫過來寫過去就是差不多一樣的**,不做重複的贅述,直接上**。
select * from t_customer where c_name like concat('%', #,'%') order by c_cerono limit 0,100
update t_customer set
c_name = #,
c_age = #,
c_*** = #,
c_cerono = #,
c_cerotype = #
where id = #
update t_customer
when id=# then #
when id=# then #
when id=# then #
when id=# then #
when id=# then #
id = #
介面
listfindbyname(string name);
int batchupdate(mapparam);
int batchupdatecasewhen(mapparam);
實現類
/**
* 用於更新時,獲取更新資料
* @param name
* @return
*/public listfindbyname(string name) catch (exception e) finally
return new arraylist();
} /**
* 批量更新第一種方式
* @param param
* @return
*/public int batchupdate(mapparam)
/*** 批量更新第二種方式
* @param param
* @return
*/public int batchupdatecasewhen(mapparam)
/*** 公共部分提出
* @param statementid
* @param param
* @return
*/private int bathupdate(string statementid,map param) catch (exception e) finally
return 0;
}
測試前準備 插入10000條資料以備下面的批量更新用。
@test
public void batchinsert() throws exception
param.put("list",list);
long start = system.currenttimemillis();
int result = customerdao.batchinsert(param);
system.out.println("耗時 : "+(system.currenttimemillis() - start));
}
開始進行測試效率問題。
首先進行的是測試十條資料。調整查詢資料為查詢十條
select * from t_customer where c_name like concat('%', #,'%') order by c_cerono limit 0,10
測試類
@test
public void batchudpate() throws exception
@test
public void batchudpatecasewhen() throws exception
private listgetfindbyname(string name, string change)
}return list;
}
第一種拼完整sql的方式耗時:
第二種case when 耗時情況:
結果可以看出,其實case when 耗時比較多。
下面來加大資料量到100條;
第一種拼完整sql的方式耗時:
第二種case when 耗時情況:
結果可以看出,其實case when 耗時仍然比第一種多。
繼續加大資料量到1000條
第一種拼完整sql的方式耗時:
第二種case when 耗時情況:
結果可以看出,其實case when 耗時仍然比第一種多。
繼續加大資料量到10000條
第一種拼完整sql的方式耗時:
第二種case when 耗時情況:
結果可以看出,兩種方式進行批量更新,效率已經不在乙個數量級了。case when明顯的慢的多。
看網上有人說第一種的效率跟用**迴圈著一條一條的迴圈著插入的效率差不多,通過測試我就有疑問了,他是怎麼做到的。難道我的**有問題?明明第一種的效率很高嘛。
第一種效率其實相當高的,因為它僅僅有乙個迴圈體,只不過最後update語句比較多,量大了就有可能造成sql阻塞。
第二種雖然最後只會有一條更新語句,但是xml中的迴圈體有點多,每乙個case when 都要迴圈一遍list集合,所以大批量拼sql的時候會比較慢,所以效率問題嚴重。使用的時候建議分批插入。
根據效率,安全方面綜合考慮,選擇適合的很重要。
**mybatis學習之路----批量更新資料兩種方法效率對比
Mybatis批量更新
mybatis批量更新 批量操作就不進行贅述了。減少伺服器與資料庫之間的互動。網上有很多關於批量插入還有批量刪除的帖子。但是批量更新卻沒有詳細的解決方案。這裡主要講的是1張table中。根據不同的id值,來update不同的property。資料表 1張。tblsupertitleresult。錯題...
mybatis 批量更新
mybatis批量更新 批量操作就不進行贅述了。減少伺服器與資料庫之間的互動。網上有很多關於批量插入還有批量刪除的帖子。但是批量更新卻沒有詳細的解決方案。這裡主要講的是1張table中。根據不同的id值,來update不同的property。資料表 1張。tblsupertitleresult。錯題...
MyBatis批量更新
批量更新時一條記錄update一次,效能比較差,容易造成阻塞。mysql沒有提供直接的方法來實現批量更新,但可以使用case when語法來實現這個功能。update course set name case id when 1 then name1 when 2 then name2 when 3...