Mybatis 关于同一条SQL语句实现批量插入和更新(SaveOrUpdate)完整版

本文介绍使用MyBatis实现批量更新或插入的两种方法:一是利用onduplicatekeyupdate语句,根据唯一主键判断并操作;二是通过selectKey查询count值,再决定更新或插入,适用于事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:我们在做批量更新或者插入时候,不想在代码中写sql查询数据库,可以通过mybatis 写sql来实现。有两种实现方法。

一、 根据相应的唯一主键来判断是否新增或更新 [对事务支持较好]

最关键的语句为: on duplicate key update

<insert id="saveOrUpdate"  parameterType="java.util.List">
            insert into user (
            id,name,age)
            values
            <foreach collection="list" item="user" separator="," >
                (
                #{id,jdbcType=INTEGER},#{user.age},
                #{user.name}
                )
            </foreach>
            on duplicate key update name= values(name)
         
    </insert>

其中name = values(name) name为数据库字段,这个是重点。

二、根据selectkey判断查询的count值是否为1,然后再进行新增或更新

 <insert id="saveOrUpdate2" >
        <selectKey keyProperty="count" resultType="int" order="BEFORE">
            select count(*) from user where id = #{id}
        </selectKey>
        <if test="count > 0">
            update user
            set age = #{aget},name = #{name}
            where id = #{id}
        </if>
        <if test="count==0">
            insert into user values(#{age},#{name})
        </if>
    </insert>

通过selectKey做第一次查询,然后根据结果进行判断,所以这里的order="BEFORE"是必须的。
也是因为BEFORE,所以没法通过标签来临时存储中间的值,只能在入参中增加属性来存放。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值