mybatis批量處理

2021-08-21 20:34:45 字數 3001 閱讀 4177

逐條更新

這種方式顯然是最簡單,也最不容易出錯的,即便出錯也只是影響到當條出錯的資料,而且可以對每條資料都比較可控,更新失敗或成功,從什麼內容更新到什麼內容,都可以在邏輯**中獲取。**可能像下面這個樣子:

updatebatch(listdatas)

catch(exception e)

}}

//mybatis中update操作的實現

update mydata

set ...

where ...

這種方式最大的問題就是效率問題,逐條更新,每次都會連線資料庫,然後更新,再釋放連線資源(雖然通過連線池可以將頻繁連線資料的效率大大提高,抗不住資料量大),這中損耗在資料量較大的時候便會體現出效率問題。這也是在滿足業務需求的時候,通常會使用上述提到的第二種批量更新的實現(當然這種方式也有資料規模的限制,後面會提到)。 

sql批量更新

一條sql語句來批量更新所有資料,下面直接看一下在mybatis中通常是怎麼寫的(去掉mybatis語法就是原生的sql語句了,所有就沒單獨說sql是怎麼寫的)。

update mydata_table 

set status=

when # then #

where id in

#

其中when...then...sql中的"switch"語法。這裡借助mybatis語法來拼湊成了批量更新的sql,上面的意思就是批量更新idupdatebatch引數所傳遞list中的資料的status字段。還可以使用實現同樣的功能,**如下:

update mydata_table

when id=# then #

where id in

#

屬性說明 

1.prefix,suffix表示在trim標籤包裹的部分的前面或者後面新增內容 

2.如果同時有prefixoverrides,suffixoverrides表示會用prefix,suffix覆蓋overrides中的內容。 

3.如果只有prefixoverrides,suffixoverrides表示刪除開頭的或結尾的***overides指定的內容。

上述**轉化成sql如下:

update mydata_table 

set status =

case

when id = # then #//此處應該是展開值

...end

where id in (...);

當然這是最簡單的批量更新實現,有時候可能需要更新多個字段,那就需要將

when id=# then #

複製拷貝多次,更改prefixwhen...then...的內容即可.而如果當需要為某個字段設定預設值的時候可以使用else

when id=# then #

else default_value

還有更常見的情況就是需要對要更新的資料進行判斷,只有符合條件的資料才能進行更新,這種情況可以這麼做:

when id=# then #

這樣的話只有要更新的liststatus != null && status != -1的資料才能進行status更新.其他的將使用預設值更新,而不會保持原資料不變.如果要保持原資料不變呢?即滿足條件的更新,不滿足條件的保持原資料不變,簡單的來做就是再加乙個,因為mybatis中沒有if...else...語法,但可以通過多個實現同樣的效果,如下:

when id=# then #

when id=# then mydata_table.status //這裡就是原資料

整體批量更新的寫法如下:

update mydata_table

when id=# then #

when id=# then mydata_table.status//原資料

where id in

#

這種批量跟心資料庫的方式可以在一次資料庫連線中更新所有資料,避免了頻繁資料庫建立和斷開連線的開銷,可以很大程度的提高資料更新效率。但是這樣的問題是如果這個過程中更新出錯,將很難知道具體是哪個資料出錯,如果使用資料自身的事務保證,那麼一旦出錯,所有的更新將自動回滾。而且通常這種方式也更容易出錯。因此通常的使用的方案是進行折中,也就是一次批量更新一部分(分頁進行更新,比如說一共有1000條資料,一次更新100條)。這樣可以分擔出錯的概率,也更容易定位到出錯的位置。 

當然如果資料量確實很大的時候,這種批量更新也一樣會導致更新效率低下(比如說一次更新100條,那如果10億條資料呢,一樣要批量更新1000萬次,建立和斷開1000萬次資料庫,這個效率是無法承受的)。這時候也許只能考慮其他方案了,比如引入快取機制等。

mybatis批量處理

在專案當中總會一次查詢滿足不了頁面所需展示的字段。這時候需要根據查出來的list迴圈去查詢另外的字段,有人會在迴圈中執行資料庫操作,這樣會建立多次資料庫連線,不但耗費效能而且會導致連線數滿。尤其是查詢大資料量的時候,效能測試的時差體現的很明顯。我們應當避免這樣的操作,去用批量處理。說明 item集合...

mybatis之批量處理

批量處理即對多條資料進行sql操作,如批量更新,插入,新增。之前採取過很low的方式,就是在dao層進行迴圈,對每條資料進行操作。這樣效果可以實現,但是頻繁連線資料庫,效能,效率上非常不好。mybatis支援引數為list的操作,這樣連線資料庫就一次,把迴圈的語句寫入到sql語句中,這樣效率會高很多...

mybatis批量修改,批量新增

mybatis批量修改 批量新增sql語句 1 單個新增 insert into t user user name,mobile values 2 新增並返回主鍵 keyproperty的屬性是要返回的主鍵欄位的名稱 insert into t user user name,mobile value...