这个时候可以采取简单的方式,list在代码里面循环里面使用saveOrUpdate来进行一条一条更新,但是一条一条更新会太慢,当数据太大时也是不行的。
所以这里采用自己重写saveOrUpdateBatch方式进行实现:
Oracle数据库:
<update id="saveOrUpdateBatch">
MERGE INTO t_oe_type t1
USING (
<foreach collection="list" item="item" index="index" separator="union">
SELECT
#{item.CategoryId} as category_id,
#{item.CategoryName} as category_name,
#{item.Brands}as brands
FROM DUAL
</foreach>
on (t1.category_id=t2.category_id)
WHEN MATCHED THEN
UPDATE SET t1.category_name=t2.category_name,t1.brands=t2.brands
WHEN NOT MATCHED THEN
INSERT ( category_id,
category_name,
brands) VALUES (t2.category_id,t2.category_name,t2.brands)
</update>
这里是采用oracle独有的
MERGE INTO xxxtable 表1 USING 数据源 表2 on 条件
来创建一个临时表与原来的数据进行对比,这时候使用MATCHED关键字来看是否匹配上了,匹配上了则使用update语句没有匹配上则使用insert语句。
但是这个方法在orcale数据库中可以进行使用,但是在mysql中不行,因为mysql中没有 MERGE INTO USING 这个语法,这时候我们需要重新换个思路去解决
mysql数据库:
<update id="saveOrUpdateBatch">
INSERT INTO t_oe_type ( category_id, category_name, brands ) select * from (
<foreach collection="list" item="item" index="index" separator="union">
SELECT
#{item.CategoryId} as category_id,
#{item.CategoryName} as category_name,
#{item.Brands}as brands
FROM DUAL
</foreach>
) t2
on duplicate KEY UPDATE category_name = t2.category_name,brands = t2.brands
</update>
mysql因为没有 MERGE INTO USING 这个语法 所以我们采用mysql特有的
on duplicate KEY UPDATE
来进行数据处理,这样也可以实现saveOrUpdateBatch操作,但是这个有一个限制条件,那就是当前传入参数中必须要有一列是主键或UNIQUE索引否则的话会寻找不到对比数据,那么会就只会进行新增操作。
重写saveOrUpdate后
mysql中主键使用自动填充UUID
:
select replace(uuid(),"-","") as uuid;
这个可以实现uuid自动生成,但是需要自己带入insert 或者update语句中:
INSERT INTO t_oe_type ( id,category_id, category_name, brands,products ) select * from (
<foreach collection="list" item="item" index="index" separator="union">
SELECT
(select replace(uuid(),"-","") as uuid) id,
#{item.CategoryId} as category_id,
#{item.CategoryName} as category_name,
#{item.Brands} as brands,
#{item.products} as products
FROM DUAL
</foreach>
) t2 on duplicate KEY UPDATE brands = t2.brands,products=t2.products
这种方法去进行更新的话,只会根据唯一索引去更新,不会根据主键更新。
此方法自用,欢迎指正!