5分鐘學會mybatis 批量更新

2021-08-26 08:52:51 字數 3624 閱讀 1365

點滴記載,點滴進步,願自己更上一層樓。

上節**了批量新增資料,這節**批量更新資料兩種寫法的效率問題。

實現方式有兩種,

一種用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...