关于MYSQL进行insert操作时,存在则更新不存在则插入的解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/System_out_print_Boy/article/details/79089498

项目开发中经常会遇到数据频发插入操作且需要进行判断,这样会业务层多一次判断的操作,多请求一次数据库,造成性能问题,所以采用以下办法解决了这个令人蓝瘦的问题。。。

这里是一个用户运动记录表,记录用户每天的运动时间,走的路程,消耗的能量和走的步数,前台是定时一分钟向后台发送一次用户的数据,在后天里进行数据保存,数据库中我们只需要根据用户ID和时间来多次更新这些数据就可以保存当前用户一天的数据

![](https://img-blog.csdn.net/20180117201215389?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU3lzdGVtX291dF9wcmludF9Cb3k=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
假如第一次传来用户的数据,我们只需要判断当前用户ID和当天的时间去数据库查询有没有这个字段,有了就进行更新操作,没有进新增一条数据记录用户今天的数据。
记得在这个RecordStep实体类中加一个count字段(int类型),mapper如下:
<insert id="insertStep" useGeneratedKeys="true" keyProperty="id" parameterType="RecordStep">
        <selectKey keyProperty="count" resultType="int" order="BEFORE">
            select count(*)  as count from tj_record_step where  CREATEBY=#{createBy} and USER_ID=#{userId}
      </selectKey>
      <!--如果不存在创建  -->
          <if test="count==0">
            INSERT INTO 
            tj_record_step
        (
            <include refid="SRecordColumns" />
        )VALUES(
            #{userId},
            #{actualTime},
            #{actualEnergy},
            #{actualMileage},
            #{actualStep},
            NOW(),
            NOW()
        )
        </if>
        <!--如果存在,更新时间  -->
        <if test="count > 0">
            UPDATE tj_record_step SET UPDATEBY=NOW() 
            <if test="actualTime !=null and actualTime !=''">
                ,ACTUAL_TIME=#{actualTime}
            </if>
            <if test="actualEnergy !=null and actualEnergy !=''">
                ,ACTUAL_ENERGY=#{actualEnergy}
            </if>
            <if test="actualMileage !=null and actualMileage !=''">
                ,ACTUAL_MILEAGE=#{actualMileage}
            </if>
            <if test="actualStep !=null and actualStep !=''">
                ,ACTUAL_STEP=#{actualStep}
            </if>
            WHERE  USER_ID=#{userId}
        </if>
    </insert>

这样就OK了。

猜你喜欢

转载自blog.csdn.net/System_out_print_Boy/article/details/79089498