Java

MyBatisで一括登録(バルクインサート)する方法

【MyBatis】BULK INSERTでデータを登録する方法

MyBatisでデータを一括登録(BULK INSERT)する方法を紹介します。

また「一括登録(BULK INSERT)」と「1件ずつ登録(INSERT)」する方法で 1万、10万、100万レコードを登録したときにかかる処理時間を測定しています。

本記事で使用するテーブル定義は次のとおり。

物理名論理名データ型NOT NULL説明
idIDBIGINT主キー(AUTO_INCREMENT)
name名前VARCHAR(100)ユーザーの名前
address住所VARCHAR(255)ユーザーの住所
phone電話番号VARCHAR(50)ユーザーの電話番号
update_date更新日時DATETIME最終更新日時
create_date作成日時DATETIME登録日時
delete_date削除日時DATETIME論理削除した日時

スポンサーリンク

SQL文(XMLファイル)

MyBatisのSQL文(XMLファイル)は次のとおり。通常のINSERT文と一括登録(BULK INSERT)のSQL文を記載しています。

[XMLファイル]

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserInfoMapper">

    <!-- 1件登録 -->
    <insert id="insert">
        INSERT INTO userInfo
        (
            name
            ,address
            ,phone
            ,update_date
            ,create_date
        )
        VALUES
        (
            #{name}
            ,#{address}
            ,#{phone}
            ,CURRENT_TIMESTAMP
            ,CURRENT_TIMESTAMP
        )
    </insert>

    <!-- 一括登録 -->
    <insert id="bulkInsert">
        INSERT INTO userInfo
        (
            name
            ,address
            ,phone
            ,update_date
            ,create_date
        )
        VALUES
        <foreach collection="userList" item="item" separator=",">
        (
            #{item.name}
            ,#{item.address}
            ,#{item.phone}
            ,CURRENT_TIMESTAMP
            ,CURRENT_TIMESTAMP
         )
        </foreach>
    </insert>

</mapper>

一括登録(BULK INSERT)は、<foreach>~</foreach>を利用し一括で登録する内容を生成しています。

Mapperクラス

MyBatisのMapperクラスは次のとおり。

[Mapperクラス]

package com.example.demo.dao;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.example.demo.entity.UserInfo;

/**
 * ユーザー情報 Mapper
 */
@Mapper
public interface UserInfoMapper {

    /**
     * ユーザー情報登録
     * @param userInfo ユーザー情報エンティティ
     */
    void insert(UserInfo userInfo);

    /**
     * ユーザー情報一括登録
     * @param userList ユーザー情報エンティティのリスト
     */
    void bulkInsert(List<UserInfo> userList);
}

測定結果

下記の表は「1件ずつ登録」した場合と「一括で登録(BULK INSERT)」した場合の測定結果です。

※測定しているPCのメモリは8GB、データベースはMySQLを使用、BULK INSERTは1000件単位で一括登録しています。

登録方法1万件10万件100万件
1件ずつ登録4秒46秒6分39秒
一括登録(1000件ずつまとめて登録)2秒7秒1分19秒

測定した結果、1件ずつ登録するよりも一括で登録(BULK INSERT)した方が圧倒的に早いという結果になりました。

大量データを扱う場合は、BULK INSERTを使用することをお勧めします。

helpful