1. 程式人生 > >關於mybatis+mysql批量插入的問題

關於mybatis+mysql批量插入的問題

  之前在寫專案時,會遇到在某個時間點內需要插入多條資料。之前我採用的方式是一次迴圈插入一條資料,每次插入都是一個過程。1.發起與資料庫的連結 2.插入一條資料。

當你需要批量插入成千上萬條的時候。就會是這個數量級乘以2,相信大部分的時間是浪費在連結資料庫上。

 批量插入成千上萬條資料,就只需要2個步驟了,連結資料量,插入資料,當然插入資料的時候sql的不同寫法,那麼執行的效率也會不同,待會我會舉一個小栗子。

 xml中的寫法

    <insert id="addDemoList" parameterType="ArrayList">
        INSERT INTO `demo` ( userId, financingId`,smashed, bonusAmount)
        VALUES
        <foreach collection="list" item="item" index="index" separator=",">
                ( #{item.userId}, #{item.financingId},#{item.smashed}, #{item.bonusAmount})
             </foreach>
    </insert>
傳入的引數是一個list

在Mapper中的介面

void addDemoList(List<Demo> item);
傳入的是的一個實體的list,當然也可以是map的list。具體用哪個可以根據實際情況來使用。
上述xml中打印出來的sql會是這樣的
INSERT INTO `smasheggrecord` ( userId, financingId,smashed, bonusAmount)
VALUES
(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount}),
(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount}),
(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount}),
(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount})
沒錯,就是這樣一個形式。這樣的好處是sql只執行一遍,速度會很快。
如果是
INSERT INTO `smasheggrecord` ( userId, financingId,smashed, bonusAmount)
VALUES(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount});
INSERT INTO `smasheggrecord` ( userId, financingId,smashed, bonusAmount)
VALUES(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount});
.
.
.
INSERT INTO `smasheggrecord` ( userId, financingId,smashed, bonusAmount)
VALUES(#{item.userId}, #{item.financingId}, #{item.smashed}, #{item.bonusAmount});
這樣的形式,那麼sql就會執行對應的次數。這也無形的減慢了插入的速度。
另外再插一句和這個無關的,如果前端POST過來一個請求,有2個引數和值全都是一模一樣,那麼後臺拿到的會是怎麼樣的呢?
栗子:
引數1:params:123
引數2:params:123
那麼後臺將會拿到的是params:123,123
做個小筆記~