專案中會遇到這樣的情況,一次性要插入多條資料到資料庫中,有兩種插入方法:
方法一:
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 的關係表資料的方法:
begininsert 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 臨時表可以是基於會話的 臨時表中的資料可以跨提交存在,即提交之前仍然存在,但是斷開連線後再連線後再連線時資料就沒有了 也可以是基於事務的 提交之後資料就消失 下面這個例子顯示了這兩種不同的臨時表。我使...