🌊
MySQL + MyBatis でBulkUpsertする方法
ON DUPLICATE KEY UPDATE を使ってUpsert
MySQLでUpsert処理をするには、ON DUPLICATE KEY UPDATEを使用します。以下は公式サイトの説明です。
ON DUPLICATE KEY UPDATE を指定したとき、UNIQUE インデックスまたは PRIMARY KEY に重複した値を発生させる行が挿入された場合は、MySQL によって古い行の UPDATE が実行されます。
MyBatisのforeachを使ってBulkUpsertをするサンプル
一括Upsertをするために、MyBatisのforeachを使います。(言語はKotlinです。)
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