逐條更新
這種方式顯然是最簡單,也最不容易出錯的,即便出錯也只是影響到當條出錯的資料,而且可以對每條資料都比較可控,更新失敗或成功,從什麼內容更新到什麼內容,都可以在邏輯**中獲取。**可能像下面這個樣子:
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
,上面的意思就是批量更新id
在updatebatch
引數所傳遞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 #
複製拷貝多次,更改prefix
和when...then...
的內容即可.而如果當需要為某個字段設定預設值的時候可以使用else
when id=# then #
else default_value
還有更常見的情況就是需要對要更新的資料進行判斷,只有符合條件的資料才能進行更新,這種情況可以這麼做:
when id=# then #
這樣的話只有要更新的list
中status != 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...