🌊

MySQL + MyBatis でBulkUpsertする方法

2022/08/02に公開

ON DUPLICATE KEY UPDATE を使ってUpsert

MySQLでUpsert処理をするには、ON DUPLICATE KEY UPDATEを使用します。以下は公式サイトの説明です。

ON DUPLICATE KEY UPDATE を指定したとき、UNIQUE インデックスまたは PRIMARY KEY に重複した値を発生させる行が挿入された場合は、MySQL によって古い行の UPDATE が実行されます。

https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html

MyBatisのforeachを使ってBulkUpsertをするサンプル

一括Upsertをするために、MyBatisのforeachを使います。(言語はKotlinです。)
foreachよく分からんという方は↓こちらを参照ください。
https://mybatis.org/mybatis-3/ja/dynamic-sql.html#foreach

サンプルでは以下のようなUserクラスを想定し、idが存在しない場合はInsert、idが存在する場合はnameとmailをUpsertする処理です。

data class User(
    val id: Long, // Primary Key
    val name: String,
    val mail: String
)
@Insert(
    """<script>
        INSERT INTO user(
            id,
	    name,
	    mail
        ) VALUES
        <foreach item="user" collection="users" open="(" seperater="),(" close=")" >
	    #{user.id},
	    #{user.name},
	    #{user.mail}
        </foreach>
	ON DUPLICATE KEY UPDATE
	    name=VALUES(name),
	    mail=VALUES(mail)
    </script>"""
)
fun upsertUsers(users: List<User>): Int

Discussion