基於Oracle的Mybatis 批量插入

2022-08-03 03:39:12 字數 1439 閱讀 8584

專案中會遇到這樣的情況,一次性要插入多條資料到資料庫中,有兩種插入方法:

方法一:

mybatis本身只支援逐條插入,比較笨的方法,就是遍歷乙個list,迴圈中逐條插入,比如下面這段** 

for(data d : listdata)

這樣做的後果就是效率嚴重低下,因為每次迴圈都要向資料庫提交一次,資料少的時候看不出來,但是如果上千條,花費的時間就相當多了

方法二:

mybatis本身是很靈活的,因為可以自己在xml檔案中編寫sql進行操作,那就可以一次性將插入到資料庫中,這樣只用向資料庫提交一次,效能也可以提高不少。下面來看乙個例子:

int batchinsert(listdatas);

insert into data (id, text, stauts) 

select

#,#,

# from dual

最後,在需要批量插入data資料的地方呼叫介面:

說明一下xml檔案的實現,使用foreach標籤,是用來拼接內部的字串,item就相當於乙個指標,用來遍歷list中的物件,將每乙個item的屬性值複製給內部sql之後,用union拼接起來,一次性執行乙個長的sql語句。   如果我們從後台列印sql執行語句的話,會看到這樣的sql語句

insert into data (id, text, stauts) 

(select ?, ?, ? from dual union

select ?, ?, ? from dual union

select ?, ?, ? from dual

)

相對於第乙個方法,第二個方法的**量要多出很多,但是從效能方面考慮,不管插入多少條資料,都只用向資料庫提交一次,這樣效率就會大幅提公升。

如果id 是使用 seq 自增長的呢?

insert into role_menu_rela (rm_id, role_id, menu_id)	

select role_menu_rela_seq.nextval,a.* from (

select #, # from dual

) a

這裡傳入的引數為 listlist 

然而,如果我傳入的物件role如下:

class role

那麼要插入 role與menu 的關係表資料的方法:

begin	

insert into role_menu_rela (rm_id, role_id, menu_id) values

(bpmp_sys_role_menu_rela_seq.nextval, #, #);

end;

將所有的sql 語句放入乙個塊中處理

基於Oracle的SQL語句備忘

1.請注意運算子的優先順序,情況複雜的,多用括號以明晰邏輯。notice precedence of operator please don t stint and if you can t clarify the situation.2.需要根據某字段為空來查詢記錄 select conditio...

Oracle 基於偽列的查詢

偽列是oracle中獨有的,偽列也是真實存在的列,也是可以用來進行查詢操作的,偽列只能用來查,不能做增刪改操作 1,偽列出現的作用到底是啥,它為何會出現?就例如 現在有兩張表 一張salary表,一張user表,每張表都有它的primary key,然後我們的物理空間該如何區別這兩張表的 prima...

Oracle基於會話和基於事務的臨時表測試例子

首發原文 http www.laozizhu.com view.jsp?articleid 120 臨時表可以是基於會話的 臨時表中的資料可以跨提交存在,即提交之前仍然存在,但是斷開連線後再連線後再連線時資料就沒有了 也可以是基於事務的 提交之後資料就消失 下面這個例子顯示了這兩種不同的臨時表。我使...