关于mybatis 您所在的位置:网站首页 mybatis-plus联合主键 关于mybatis

关于mybatis

2023-04-03 05:27| 来源: 网络整理| 查看: 265

mybatis-plus 中saveOrUpdateBatch都是采用默认策略(主键)作为判断该数据存在与否的依据,当我们需要使用其他字段作为判断条件的时候,发现不论怎么使用都不行。

 

 

这个时候可以采取简单的方式,list在代码里面循环里面使用saveOrUpdate来进行一条一条更新,但是一条一条更新会太慢,当数据太大时也是不行的。

所以这里采用自己重写saveOrUpdateBatch方式进行实现:

Oracle数据库:

MERGE INTO t_oe_type t1 USING ( SELECT #{item.CategoryId} as category_id, #{item.CategoryName} as category_name, #{item.Brands}as brands FROM DUAL ) t2 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)

这里是采用oracle独有的 MERGE INTO xxxtable 表1 USING 数据源 表2  on 条件 来创建一个临时表与原来的数据进行对比,这时候使用MATCHED关键字来看是否匹配上了,匹配上了则使用update语句没有匹配上则使用insert语句。

但是这个方法在orcale数据库中可以进行使用,但是在mysql中不行,因为mysql中没有  MERGE INTO USING 这个语法,这时候我们需要重新换个思路去解决

mysql数据库:

INSERT INTO t_oe_type ( category_id, category_name, brands ) select * from ( SELECT #{item.CategoryId} as category_id, #{item.CategoryName} as category_name, #{item.Brands}as brands FROM DUAL ) t2    on duplicate KEY UPDATE category_name = t2.category_name,brands = t2.brands

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 ( 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 ) t2 on duplicate KEY UPDATE brands = t2.brands,products=t2.products

这种方法去进行更新的话,只会根据唯一索引去更新,不会根据主键更新。

此方法自用,欢迎指正!

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有