怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中實(shí)現(xiàn)批量插入數(shù)據(jù)?

Oracle版本方案(目前只找到Oracle的解決辦法粱胜,SQL

Server的歡迎大家補(bǔ)充)

參考博客:Mybatis批處理

參考博客:Oracle存儲(chǔ)過(guò)程實(shí)現(xiàn)JAVA中的LIST輸入?yún)?shù)

說(shuō)明:數(shù)據(jù)庫(kù)版本為11g,基本上除了存儲(chǔ)過(guò)程別的都是相對(duì)固定的格式亡嫌,親測(cè)通過(guò)。

第一步:創(chuàng)建兩個(gè)自建類型

CREATE OR REPLACE TYPE xxxobj AS OBJECT(

aVARCHAR2(10),

bVARCHAR2(10),

cVARCHAR2(50)

);

CREATE OR REPLACE TYPE xxxtable AS TABLE OFxxxobj;

第二步:編寫存儲(chǔ)過(guò)程

CREATE OR REPLACE PROCEDURE xxxprocedure(names IN VARCHAR,xxxlist IN xxxtable )

BEGIN

FOR I IN 1..xxxlist.COUNT LOOP

INSERT INTO xxx VALUES

(

xxxlist(I).a,

xxxlist(I).b,

xxxlist(I).c

);

...

...

...

第三步:java代碼

xml文件:

{CALL xxxprocedure (?,?)}

java:編寫xxxHandler類泵额,繼承BaseTypeHandler并重寫setNonNullParameter、getArray

@SuppressWarnings("unchecked")

@Override

public voidsetNonNullParameter(PreparedStatement parameterSetter, int i, Object o,JdbcTypejdbcType) throws SQLException {

Connectionconn = null;

try {

if (null != o) {

List list= (ArrayList) o;

conn =DriverManager.getConnection("jdbc:oracle:thin:xxx", "xxx","xxx");

ARRAY array = getArray(conn,"xxxobj", "xxxtable", list);

parameterSetter.setArray(i,array);

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

} finally {

if (null != conn) {

conn.close();

}

}

}

@SuppressWarnings("rawtypes")

@Override

private Array setNonNullParametergetArray(Connection con, String OracleObj, String Oraclelist, List listData)throws Exception {

ARRAYarray = null;

ArrayDescriptordesc = ArrayDescriptor.createDescriptor(Oraclelist, con);

STRUCT[]structs = new STRUCT[listData.size()];

if (listData != null &&listData.size() > 0) {

StructDescriptor structdesc = newStructDescriptor(OracleObj, con);

for (int i = 0; i < listData.size();i++) {

Object[] result = {((xxxClass)listData.get(i)).getA(),((xxxClass) listData.get(i)).getB(),((xxxClass)listData.get(i)).getC()};

structs[i]= new STRUCT(structdesc, con, result);

}

array = new ARRAY(desc, con, structs);

}else{

array= new ARRAY(desc, con, structs);

}

return array;

}

---------------------------------------------------分割線----------------------------------------------------------

SqlServer版本辦法携添,兼容Oracle(說(shuō)是辦法而不算是方案嫁盲,這是因?yàn)槠渲邪艘恍┢媲梢迹沂沁@么認(rèn)為的烈掠,上不了臺(tái)面羞秤。)

好了,開始代碼左敌,第一步也是唯一的一步:我稱之為拆分list

int n=list.size();

while(n>500){

xxxMapper.insertlist.subList(0,500));

list.subList(0, 500).clear();

n=list.size();

}

if(n>0){

xxxMapper.insert(list);

}

簡(jiǎn)單吧瘾蛋,其中500這個(gè)參數(shù)卻決于你的數(shù)據(jù)庫(kù)類型和你的sql對(duì)應(yīng)的參數(shù)個(gè)數(shù)(SqlServer2005的傳入?yún)?shù)是限制2200個(gè)左右,假如你的sql要向表A(除主鍵外矫限,3個(gè)字段)插入記錄瘦黑,那這個(gè)參數(shù)就是2200除3取整京革。而list的subList這個(gè)方法相信你也是熟到不能再熟了。另外幸斥,insert方法是定義在mapper.xml中的方法匹摇,利用foreach標(biāo)簽實(shí)現(xiàn)。不用擔(dān)心事務(wù)甲葬,如果報(bào)異常是會(huì)整體回滾的廊勃,前提是你配置了事務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末经窖,一起剝皮案震驚了整個(gè)濱河市坡垫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌画侣,老刑警劉巖冰悠,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異配乱,居然都是意外死亡溉卓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門搬泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桑寨,“玉大人,你說(shuō)我怎么就攤上這事忿檩∥疚玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵燥透,是天一觀的道長(zhǎng)沙咏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)班套,這世上最難降的妖魔是什么肢藐? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮孽尽,結(jié)果婚禮上窖壕,老公的妹妹穿的比我還像新娘忧勿。我一直安慰自己杉女,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布鸳吸。 她就那樣靜靜地躺著熏挎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晌砾。 梳的紋絲不亂的頭發(fā)上坎拐,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼哼勇。 笑死都伪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的积担。 我是一名探鬼主播陨晶,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帝璧!你這毒婦竟也來(lái)了先誉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤的烁,失蹤者是張志新(化名)和其女友劉穎褐耳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渴庆,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃芦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了把曼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杨帽。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗤军,靈堂內(nèi)的尸體忽然破棺而出注盈,到底是詐尸還是另有隱情,我是刑警寧澤叙赚,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布老客,位于F島的核電站,受9級(jí)特大地震影響震叮,放射性物質(zhì)發(fā)生泄漏胧砰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一苇瓣、第九天 我趴在偏房一處隱蔽的房頂上張望尉间。 院中可真熱鬧,春花似錦击罪、人聲如沸哲嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眠副。三九已至,卻和暖如春竣稽,著一層夾襖步出監(jiān)牢的瞬間囱怕,已是汗流浹背霍弹。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娃弓,地道東北人典格。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像台丛,于是被迫代替她去往敵國(guó)和親钝计。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容