點滴記載,點滴進步,願自己更上一層樓。
上節**了批量新增資料,這節**批量更新資料兩種寫法的效率問題。
實現方式有兩種,
一種用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學習之路----批量更新資料兩種方法效率對比
5分鐘學會 CSS Grid 布局
這是一篇快速介紹 未來布局的文章。css grid 布局 grid 布局是 設計的基礎,css grid 是建立網格布局最強大和最簡單的工具。css grid 今年也獲得了主流瀏覽器 safari,chrome,firefox,edge 的原生支援,所以我相信所有的前端開發人員都必須在不久的將來學習...
5分鐘學會使用gitlab
1.新建專案 首先你得有個gitlab賬號以及本地已安裝git.exe,或者有git環境,然後建立乙個專案project,右上角有個加號按鈕,用來新建專案 git在上傳專案方面非常友好,建專案的時候你可以選擇從別的地方匯入你之前已經寫好的 也可以本地git上傳,新建的專案最好選擇私有private。...
10分鐘學會Google Map API
前幾天玩了玩google的map api,感覺還不錯,很簡單。但凡有過任何程式設計經驗的同學,看完以下的教程,都可以在10分鐘內掌握它的主要功能。另外我還做了個簡單的小例子,有興趣的話,請參見 第一步 去 申請乙個keyid 第二步 在html的之間加上對mapapi函式庫的引用,第三步 在html...