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

时间:2024-11-09 20:48:31

文章目录

      • 一、 根据相应的唯一主键来判断是否新增或更新 [对事务支持较好]
      • 二、根据selectkey判断查询的count值是否为1,然后再进行新增或更新

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

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

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

<insert id="saveOrUpdate"  parameterType="">
            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,所以没法通过标签来临时存储中间的值,只能在入参中增加属性来存放。