MyBatis批量插入數(shù)據(jù)實現(xiàn)(MySQL)

假如需要搬一萬塊磚到樓頂,有一部電梯足绅,電梯一次可以放適量的磚(最多放 500)捷绑。可以選擇一次運送一塊磚氢妈,也可以一次運送 500 塊磚粹污,哪個時間消耗大?

一、sql 層面實現(xiàn)數(shù)據(jù)插入

  1. 單條插入數(shù)據(jù)的寫法:
insert into table ([列名],[列名])  values ([列值],[列值]));
或:
insert into table values ([列值],[列值]));
  1. 批量插入
    一種可以在代碼中循環(huán)執(zhí)行上面的語句首量,但是這種效率太差壮吩。另一種,可以用 MySQL 支持的批量插入語句加缘,這種方式更高效鸭叙。
insert into table  ([列名],[列名]) 
 VALUES
([列值],[列值]),
([列值],[列值]),
([列值],[列值]);

批量的好處:可以避免程序和數(shù)據(jù)庫建立多次連接,增加服務器負荷拣宏。

二沈贝、MyBatis 層面批量插入數(shù)據(jù)到數(shù)據(jù)庫

兩種方式:xml 文件和注解。使用批量插入執(zhí)行的 sql 語句應該等價于:

 insert into table (id, name,sex,address)
 values
 (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)

1??xml 配置

最基礎的是用 mapping.xml 配置的方式勋乾,包括以下兩種具體方式:

  1. mapping.xml 中 insert 語句可以寫成單條插入宋下,在調(diào)用方循環(huán) 1000 次
<!-- 在外部for循環(huán)調(diào)用1000次 -->
<insert id="insert" parameterType="com.xxp.mybatis.Person">
    insert into person (id, name,sex,address)
    values 
    (#{id,jdbcType=INTEGER},#{name,jdbcType=VARCHAR},
    #{sex,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR})
</insert>
  1. mapping.xml 中 insert 語句寫成一次性插入一個 1000 的 list
<insert id="insertBatch" >
    insert into person ( <include refid="Base_Column_List" /> ) 
    values 
    <foreach collection="list" item="item" index="index" separator=",">
        (null,#{item.name},#{item.sex},#{item.address})
    </foreach>
</insert>

參數(shù)解釋
foreach 的主要作用在構建 in 條件中,它可以在 sql 語句中進行迭代一個集合辑莫。foreach 元素的屬性主要有 collection学歧,item,separator各吨,index枝笨,open,close。

  1. collection:指定要遍歷的集合横浑。表示傳入過來的參數(shù)的數(shù)據(jù)類型剔桨。該屬性是必須指定的,要做 foreach 的對象徙融。在使用 foreach 的時候最關鍵的也是最容易出錯的就是 collection 屬性领炫。在不同情況 下,該屬性的值是不一樣的张咳,主要有一下 3 種情況:
    a. 如果傳入的是單參數(shù)且參數(shù)類型是一個 List 的時候,collection 屬性值為 list似舵。
    b. 如果傳入的是單參數(shù)且參數(shù)類型是一個數(shù)組的時候脚猾,collection 的屬性值為 array。
    c. 如果傳入的參數(shù)是多個的時候砚哗,就需要把它們封裝成 Map龙助,當然單參數(shù)也可以封裝成 Map。Map 對象沒有默認的鍵蛛芥。

  2. item:表示集合中每一個元素進行迭代時的別名提鸟。將當前遍歷出的元素賦值給指定的變量,然后用#{變量名}仅淑,就能取出變量的值称勋,也就是當前遍歷出的元素。

  3. separator:表示在每次進行迭代之間以什么符號作為分隔符涯竟。select * from tab where id in(1,2,3)相當于1,2,3之間的","

  4. index:索引赡鲜。index 指定一個名字,用于表示在迭代過程中庐船,每次迭代到的位置银酬。遍歷 list 的時候 index 就是索引,遍歷 map 的時候 index 表示的就是 map 的 key筐钟,item 就是 map 的值揩瞪。

  5. open/close:表示該語句以什么開始/結束。

mapper 接口中的使用:

public interface TabMapper {
    public List<Tab> getTabsByConditionLike(@Param("list")List<Integer> ids);
}

2??注解

MyBatis 提供用于插入數(shù)據(jù)的注解有兩個:@insert篓冲,@InsertProvider李破。類似還有:@DeleteProvider、@UpdateProvider和@SelectProvider纹因。
作用:
用來在實體類的 Mapper 類里注解保存方法的 sql 語句喷屋。
區(qū)別:
@Insert 是直接配置 sql 語句,而 @InsertProvider 則是通過 sql 工廠類及對應的方法生產(chǎn) sql 語句瞭恰,這種方法的好處在于屯曹,可以根據(jù)不同的需求生產(chǎn)出不同的 sql,適用性更好。
使用:

@Insert("insert into blog(blogId,title,author) values(#blogId,#title,#author)")
public boolean saveBlog(Blog blog);
@InsertProvider
在 mapper 接口中的方法上使用 @InsertProvider 注解:

參數(shù)解釋:
type 為工廠類的類對象恶耽,
method 為對應的工廠類中的方法密任,方法中的 @Param(“l(fā)ist”) 是因為批量插入傳入的是一個 list,但是 Mybatis 會將其包裝成一個 map偷俭。其中 map 的 key 為“l(fā)ist”浪讳,value為傳入的 list。

三涌萤、xml/注解 兩種方式的區(qū)別

1??foreach 相當語句逐條 insert 語句執(zhí)行淹遵,將出現(xiàn)如下問題:

  1. mapper 接口的 insert 方法返回值將是最后一條 insert 語句的操作成功的記錄數(shù)目(就是0或1),而不是所有 insert 語句的操作成功的總記錄數(shù)目负溪;
  2. 當其中一條不成功時透揣,不會進行整體回滾。

2??注解方式:當有一條插入不成功時川抡,會整體回滾辐真。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市崖堤,隨后出現(xiàn)的幾起案子侍咱,更是在濱河造成了極大的恐慌,老刑警劉巖密幔,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楔脯,死亡現(xiàn)場離奇詭異,居然都是意外死亡胯甩,警方通過查閱死者的電腦和手機淤年,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜡豹,“玉大人麸粮,你說我怎么就攤上這事【盗” “怎么了弄诲?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娇唯。 經(jīng)常有香客問我齐遵,道長,這世上最難降的妖魔是什么塔插? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任梗摇,我火速辦了婚禮,結果婚禮上想许,老公的妹妹穿的比我還像新娘伶授。我一直安慰自己断序,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布糜烹。 她就那樣靜靜地躺著违诗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疮蹦。 梳的紋絲不亂的頭發(fā)上诸迟,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音愕乎,去河邊找鬼阵苇。 笑死,一個胖子當著我的面吹牛感论,可吹牛的內(nèi)容都是我干的慎玖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笛粘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湿硝?” 一聲冷哼從身側響起薪前,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关斜,沒想到半個月后示括,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡痢畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年垛膝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁稀。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼拥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出线衫,到底是詐尸還是另有隱情凿可,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布授账,位于F島的核電站枯跑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏白热。R本人自食惡果不足惜敛助,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋确。 院中可真熱鬧纳击,春花似錦续扔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至百匆,卻和暖如春砌些,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背加匈。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工存璃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雕拼。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓纵东,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啥寇。 傳聞我的和親對象是個殘疾皇子偎球,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL辑甜、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評論 0 4
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,326評論 0 85
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲過程和高級映射...
    有_味閱讀 2,904評論 0 26
  • 1衰絮、什么是Mybatis? (1)Mybatis是一個半ORM(對象關系映射)框架磷醋,它內(nèi)部封裝了JDBC猫牡,開發(fā)時只...
    裘馬輕狂大帥閱讀 413評論 0 8
  • 曾教劉伶賦墨章,也邀太白縱詩行邓线。 山林獨酌陶公趣淌友,窮路悲嚎阮籍狂。 掃愁帚骇陈,忘憂漿震庭。推杯換盞月同嘗。 莫思身外無窮...
    當初不該下凡閱讀 575評論 0 2