【轉(zhuǎn)】Mybatis中曹质,當(dāng)插入數(shù)據(jù)后,返回最新主鍵id的幾種方法擎场,及具體用法

轉(zhuǎn)自:http://blog.csdn.net/sinat_30474567/article/details/51395247

一羽德、前言

數(shù)據(jù)庫(kù)操作怎能少了INSERT操作呢?下面記錄MyBatis關(guān)于INSERT操作的筆記迅办,以便日后查閱宅静。

二、 insert元素 屬性詳解

其屬性如下:

  • parameterType 站欺,入?yún)⒌娜薅?lèi)名或類(lèi)型別名
  • keyColumn 坏为,設(shè)置數(shù)據(jù)表自動(dòng)生成的主鍵名。對(duì)特定數(shù)據(jù)庫(kù)(如PostgreSQL)镊绪,若自動(dòng)生成的主鍵不是第一個(gè)字段則必須設(shè)置
  • keyProperty 匀伏,默認(rèn)值unset,用于設(shè)置getGeneratedKeys方法或selectKey子元素返回值將賦值到領(lǐng)域模型的哪個(gè)屬性中
  • useGeneratedKeys 蝴韭,取值范圍true|false(默認(rèn)值)够颠,設(shè)置是否使用JDBC的getGenereatedKeys方法獲取主鍵并賦值到keyProperty設(shè)置的領(lǐng)域模型屬性中。MySQL和SQLServer執(zhí)行auto-generated key field榄鉴,因此當(dāng)數(shù)據(jù)庫(kù)設(shè)置好自增長(zhǎng)主鍵后履磨,可通過(guò)JDBC的getGeneratedKeys方法獲取蛉抓。但像Oralce等不支持auto-generated key field的數(shù)據(jù)庫(kù)就不能用這種方法獲取主鍵了
  • statementType ,取值范圍STATEMENT,PREPARED(默認(rèn)值),CALLABLE
  • flushCache 剃诅,取值范圍true(默認(rèn)值)|false巷送,設(shè)置執(zhí)行該操作后是否會(huì)清空二級(jí)緩存和本地緩存
  • timeout ,默認(rèn)為unset(依賴(lài)jdbc驅(qū)動(dòng)器的設(shè)置)矛辕,設(shè)置執(zhí)行該操作的最大時(shí)限笑跛,超時(shí)將拋異常
  • databaseId ,取值范圍Oracle|mysql等聊品,表示數(shù)據(jù)庫(kù)廠家飞蹂,元素內(nèi)部可通過(guò)<if test="_databaseId = '[oracle](http://lib.csdn.net/base/oracle)'">來(lái)為特定數(shù)據(jù)庫(kù)指定不同的sql語(yǔ)句

三、一般的INSERT操作——返回值為插入的記錄數(shù)目

mapper接口代碼:

/**
 * 添加學(xué)生信息
 * @param student 學(xué)生實(shí)例
 * @return 成功操作的記錄數(shù)目
 */
int add(EStudent student);

mapper.xml:

<insert id="add" parameterType="EStudent">
  insert into TStudent(name, age) values(#{name}, #{age})
</insert>

四翻屈、執(zhí)行INSERT操作后獲取記錄主鍵

mapper接口代碼:

/**
 * 添加學(xué)生信息
 * @param student 學(xué)生實(shí)例
 * @return 成功操作的記錄數(shù)目
 */
int add(EStudent student);

至于mapper.xml則分為兩種情況了陈哑,一種是數(shù)據(jù)庫(kù)(如MySQL,SQLServer)支持auto-generated key field,另一種是數(shù)據(jù)庫(kù)(如Oracle)不支持auto-generated key field的伸眶。

1.數(shù)據(jù)庫(kù)(如MySQL,SQLServer)支持auto-generated key field的情況

手段①(推薦做法):

<insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
  insert into TStudent(name, age) values(#{name}, #{age})
</insert>

手段②:

<insert id="add" parameterType="EStudent">
  // 下面是SQLServer獲取最近一次插入記錄的主鍵值的方式
  <selectKey resultType="_long" keyProperty="id" order="AFTER">
    select @@IDENTITY as id
  </selectKey>
  insert into TStudent(name, age) values(#{name}, #{age})
</insert>

由于手段②獲取主鍵的方式依賴(lài)數(shù)據(jù)庫(kù)本身惊窖,因此推薦使用手段①。

2. 數(shù)據(jù)庫(kù)(如Oracle)不支持auto-generated key field的情況
<insert id="add" parameterType="EStudent">
  <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1
  </selectKey>
  insert into TStudent(id, name, age) values(#{id}, #{name}, #{age})
</insert>

注意:mapper接口返回值依然是成功插入的記錄數(shù)厘贼,但不同的是主鍵值已經(jīng)賦值到領(lǐng)域模型實(shí)體的id中了界酒。

五、 selectKey子元素 詳解

作用:在insert元素和update元素中插入查詢(xún)語(yǔ)句涂臣。
其屬性如下:

  • keyProperty ,默認(rèn)值unset售担,用于設(shè)置getGeneratedKeys方法或selectKey子元素返回值將賦值到領(lǐng)域模型的哪個(gè)屬性中
  • resultType 赁遗,keyPropety所指向的屬性類(lèi)全限定類(lèi)名或類(lèi)型別名
  • order屬性 ,取值范圍BEFORE|AFTER族铆,指定是在insert語(yǔ)句前還是后執(zhí)行selectKey操作
  • statementType 岩四,取值范圍STATEMENT,PREPARED(默認(rèn)值),CALLABLE

注意:selectKey操作會(huì)將操作查詢(xún)結(jié)果賦值到insert元素的parameterType的入?yún)?shí)例下對(duì)應(yīng)的屬性中。并提供給insert語(yǔ)句使用

六哥攘、批量插入

方式1:
<insert id="add" parameterType="EStudent">
  <foreach collection="list" item="item" index="index" separator=";">
    INSERT INTO TStudent(name,age) VALUES(#{item.name}, #{item.age})
  </foreach>
</insert>

上述方式相當(dāng)語(yǔ)句逐條INSERT語(yǔ)句執(zhí)行剖煌,將出現(xiàn)如下問(wèn)題:1. mapper接口的add方法返回值將是最一條INSERT語(yǔ)句的操作成功的記錄數(shù)目(就是0或1),而不是所有INSERT語(yǔ)句的操作成功的總記錄數(shù)目2. 當(dāng)其中一條不成功時(shí)逝淹,不會(huì)進(jìn)行整體回滾耕姊。

方式2(僅限于MSSQL):
<insert id="add" parameterType="EStudent">
  WITH R AS
  <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    SELECT #{item.name} as a, #{item.age} as b
  </foreach>
  INSERT INTO TStudent(name,age) SELECT a, b FROM R
</insert>

上述方式解決了方式1中的問(wèn)題。但該方式僅限于MSSQL

方式3(MSSQL):
 INSERT INTO TStudent(name,age) 
  <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    SELECT #{item.name} as a, #{item.age} as b
  </foreach>

該方式與方式2效果一樣栅葡,若為Oracle則采用

INSERT INTO TStudent(name,age) 
  <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    SELECT #{item.name} as a, #{item.age} as b FROM DUAL
  </foreach>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茉兰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欣簇,更是在濱河造成了極大的恐慌规脸,老刑警劉巖坯约,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莫鸭,居然都是意外死亡闹丐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)被因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卿拴,“玉大人,你說(shuō)我怎么就攤上這事氏身∥±猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蛋欣,是天一觀的道長(zhǎng)航徙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陷虎,這世上最難降的妖魔是什么到踏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮尚猿,結(jié)果婚禮上窝稿,老公的妹妹穿的比我還像新娘。我一直安慰自己凿掂,他們只是感情好伴榔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著庄萎,像睡著了一般踪少。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠涛,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天援奢,我揣著相機(jī)與錄音,去河邊找鬼忍捡。 笑死集漾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砸脊。 我是一名探鬼主播具篇,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凌埂!你這毒婦竟也來(lái)了栽连?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秒紧,沒(méi)想到半個(gè)月后绢陌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熔恢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年脐湾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叙淌。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秤掌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹰霍,到底是詐尸還是另有隱情闻鉴,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布茂洒,位于F島的核電站孟岛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏督勺。R本人自食惡果不足惜渠羞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望智哀。 院中可真熱鬧次询,春花似錦、人聲如沸瓷叫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摹菠。三九已至盒卸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辨嗽,已是汗流浹背世落。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工淮腾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糟需,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓谷朝,卻偏偏與公主長(zhǎng)得像洲押,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圆凰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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