mybatis中批量插入,若存在,则更新;不存在,则新增

本文介绍了如何在MyBatis中使用`ON DUPLICATE KEY UPDATE`实现乐观锁,以避免数据冲突。在实践中,发现该方法可能导致锁表问题,因此提出在数据量不大时,通过代码先查询再更新或插入的方式来避免。同时,讨论了这种方法的适用场景和潜在优化思路。
摘要由CSDN通过智能技术生成

直接撸代码

一、mapper层

void insert(@Param("list") List<Student> list);

二、mybatis层

    <insert id="insert">
        insert into student
        (s_id,s_achievement,s_a_type)
        values
        <foreach collection="list" index="index" item="item" separator=",">
            (#{item.sId},#{item.sAchievement},#{item.sAType})
        </foreach>
        ON DUPLICATE KEY UPDATE
        s_achievement = VALUES(s_achievement)
    </insert>

三、表结构

 ON DUPLICATE KEY UPDATE s_achievement = VALUES(s_achievement) 括号中的变量,应该与表中的字段名一致,就是你需要更改的字段名

如果是你要根据s_id 和 s_a_type 这两个字段去过滤是否存在,那就在表里面需要给这两个字段增加唯一键

2022年6月16日补:

在发现跑了一段数据后,发现会出现报错,经排查,可能会导致锁表。后续有发现不同问题

查看具体大神分析锁表​​​​​​​​​​​​​​​​​​​​​

最后查看数据量一天也不是很大,最终决定,使用代码进行先查,然后再新增或修改

其他问题:

 

建议:如果数据量不是很大的情况下,可选择代码进行。

鄙人不才,如有大神,可推荐更好的解决思路。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 MyBatis 提供的批量插入更新方法,具体实现如下: 1. 首先,你需要在 Mapper 接口定义一个批量插入更新的方法,如下所示: ``` void batchInsertOrUpdate(List<Entity> entities); ``` 2. 在 Mapper.xml 文件,你需要编写对应的 SQL 语句,如下所示: ``` <insert id="batchInsertOrUpdate" parameterType="java.util.List"> <foreach collection="list" item="entity" index="index" separator=";"> <choose> <when test="entity.id != null"> UPDATE table SET column1 = #{entity.column1}, column2 = #{entity.column2} WHERE id = #{entity.id} </when> <otherwise> INSERT INTO table (column1, column2) VALUES (#{entity.column1}, #{entity.column2}) </otherwise> </choose> </foreach> </insert> ``` 3. 最后,在代码调用该方法即可: ``` List<Entity> entities = new ArrayList<>(); // 添加需要插入或更新的实体对象 mapper.batchInsertOrUpdate(entities); ``` 注意,这里的 Entity 对象需要包含需要插入或更新的字段和对应的值,同时需要在 Mapper.xml 文件定义对应的表名和列名。 ### 回答2: 在MyBatis,可以使用动态SQL来实现批量存在更新不存在新增的操作。 首先,我们需要一个包含需要更新的数据的List,对应数据库表的字段。 接下来,我们可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句来实现批量存在更新不存在新增的操作。在该语句,使用VALUES()来获取要更新的字段值。 在MyBatis的mapper文件,可以使用foreach循环来遍历需要更新的数据,并生成对应的SQL语句。 具体实现步骤如下: 1. 在mapper文件,创建一个updateOrInsert方法,该方法接收一个List类型的参数,用于存储需要更新的数据。 2. 在mapper文件,使用foreach循环遍历List的数据。 <foreach item="item" index="index" collection="list" separator=";"> INSERT INTO table_name (column1, column2, ...) VALUES (#{item.property1}, #{item.property2}, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ... </foreach> 其,table_name为数据库表名,column1、column2等为需要更新的字段名,#{item.property1}、#{item.property2}为对应的值。 3. 调用updateOrInsert方法,并传入需要更新的数据List即可。 这样,通过使用MyBatis的动态SQL和foreach循环,就可以实现批量存在更新不存在新增的操作。 ### 回答3: 在使用MyBatis进行批量更新时,可以通过以下步骤实现存在更新不存在新增的操作: 1. 首先,创建一个包含需要更新新增的数据的列表。数据列表可以包含待更新的数据和待新增的数据。 ``` List<T> dataList = new ArrayList<>(); T dataToUpdate = new T(); // 设置待更新的数据的属性 dataList.add(dataToUpdate); T dataToInsert = new T(); // 设置待新增的数据的属性 dataList.add(dataToInsert); ``` 2. 在对应的Mapper接口,添加一个方法用于批量更新数据。方法的参数应该是一个包含数据列表的集合。 ``` void batchUpdate(@Param("dataList") List<T> dataList); ``` 3. 在Mapper的XML文件,编写对应的SQL语句。 ``` <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="dataList" item="data" separator=";"> <choose> <when test="data.id != null"> UPDATE table_name SET column1 = #{data.column1}, column2 = #{data.column2} WHERE id = #{data.id} </when> <otherwise> INSERT INTO table_name (column1, column2) VALUES (#{data.column1}, #{data.column2}) </otherwise> </choose> </foreach> </update> ``` 在上面的SQL语句,使用了`<foreach>`标签将数据列表的每个数据循环进行处理。根据数据的属性(如id)是否为空可以判断是进行更新操作还是新增操作。 4. 在使用的地方调用批量更新方法,传入数据列表。 ``` List<T> dataList = new ArrayList<>(); // 添加待更新和待新增的数据到列表 ... myMapper.batchUpdate(dataList); ``` 以上就是使用MyBatis实现存在更新不存在新增的方法。通过判断数据的属性是否为空,可以动态地生成对应的SQL语句来完成批量操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值