mybatis的批量更新

2021-08-25 05:43:52 字數 3600 閱讀 1895

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

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

實現方式有兩種,

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