mybatis如何实现saveOrUpdate

 更新时间:2023年02月08日 08:39:40   作者:分享心得  
这篇文章主要介绍了mybatis如何实现saveOrUpdate问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1. selectKey标签查询

DDL

CREATE TABLE `luck_reward_info` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
  `activity_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '活动id',
  `reward_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '奖品名',
  `reward_level` int DEFAULT NULL COMMENT '奖品等级',
  `num` int DEFAULT NULL COMMENT '奖品数量',
  `dis_number` int DEFAULT '0' COMMENT '已发奖品数量',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `field` varchar(255) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`,`activity_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='奖品信息表';

RewardInfoMapper接口

@Mapper
public interface RewardInfoMapper{
   int saveOrUpdate(RewardInfo rewardInfo);
}

使用selectKey

<insert id="saveOrUpdate" >
  <selectKey keyProperty="count" resultType="int" order="BEFORE">
    select count(*) from luck_reward_info where id = #{id}
  </selectKey>
  <if test="count > 0">
        UPDATE luck_reward_info
        <set>
            <if test='activityId != null and activityId != "" '>activity_id=#{activityId},</if>
            <if test='rewardName != null and rewardName != "" '>reward_name=#{rewardName},</if>
            <if test='rewardLevel != null '>reward_level=#{rewardLevel},</if>
            <if test='num != null '>num=#{num},</if>
            <if test='disNumber != null '>dis_number=#{disNumber},</if>
            update_time=now(),
            <if test='field != null and field != "" '>field=#{field},</if>
        </set>
        WHERE id=#{id}
  </if>
  <if test="count==0">
    INSERT INTO luck_reward_info(
            id,activity_id,reward_name,reward_level,number,create_time,field
            )
            VALUES (
            (select id from (select (ifnull(max(id), 0)) + 1 as id from luck_reward_info)t), #{activityId},#{rewardName},#{rewardLevel},#{number},now(),#{field}
            )
  </if>
</insert>

报错:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No setter found for the keyProperty ‘count’ in com.cmbchina.ssm.entity.RewardInfo.

原因:RewardInfo内必须有count属性,来接收count值,否则报错

优化:接口使用Map,实体类不需要再新增count字段了

//RewardInfoMapper.java
int saveOrUpdate(Map<String, Object> map);

2. 主键自增或者累加的,不使用selectKey

根据id是否为空,空新增,不为空修改

<insert id="saveOrUpdate" keyProperty="id" useGeneratedKeys="true">
        <if test="id == null">
            INSERT INTO luck_reward_info(
                id,activity_id,reward_name,reward_level,num,create_time,field
            )
            VALUES (
                (select id from (select (ifnull(max(id), 0)) + 1 as id from luck_reward_info)t), #{activityId},#{rewardName},#{rewardLevel},#{num},now(),#{field}
            )
        </if>
        <if test="id != null">
            UPDATE luck_reward_info
            <set>
                <if test='activityId != null and activityId != "" '>activity_id=#{activityId},</if>
                <if test='rewardName != null and rewardName != "" '>reward_name=#{rewardName},</if>
                <if test='rewardLevel != null '>reward_level=#{rewardLevel},</if>
                <if test='num!= null '>num=#{num},</if>
                <if test='disNumber != null '>dis_number=#{disNumber},</if>
                update_time=now(),
                <if test='field != null and field != "" '>field=#{field},</if>
            </set>
            WHERE id=#{id}
        </if>
    </insert>

3. 主键为varchar的使用ON DUPLICATE KEY UPDATE

DDL

CREATE TABLE `luck_activity_info` (
  `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '标题',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间',
  `sap_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作员工编号',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='抽奖活动表';

条数 新增返回1,修改返回2

<insert id="saveOrUpdate">
        INSERT INTO luck_activity_info(
            id,title,start_time,end_time,sap_id,create_time
        )
        VALUES (
            #{id},#{title},#{startTime},#{endTime},#{sapId},now()
        )
        ON DUPLICATE KEY UPDATE
            <if test='title != null and title != "" '>title=#{title},</if>
            <if test='startTime != null '>start_time=#{startTime},</if>
            <if test='endTime != null '>end_time=#{endTime},</if>
            <if test='sapId != null and sapId != "" '>sap_id=#{sapId},</if>
            update_time=now()
    </insert>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java8 日期和时间类的基本使用

    Java8 日期和时间类的基本使用

    这篇文章主要介绍了Java 日期和时间类的基本使用,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • 在Elasticsearch中添加字段的详细步骤

    在Elasticsearch中添加字段的详细步骤

    在ES中,增加字段相对比较容易,因为ES支持动态映射(Dynamic Mapping),这篇文章主要给大家介绍了关于在Elasticsearch中添加字段的详细步骤,文中给出了详细的代码实例,需要的朋友可以参考下
    2024-07-07
  • hibernate-validator改进校验框架validator v0.4使用

    hibernate-validator改进校验框架validator v0.4使用

    这篇文章主要为大家介绍了改进 hibernate-validator,新一代校验框架 validator 使用介绍 v0.4,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-03-03
  • java客户端线上Apollo服务端的实现

    java客户端线上Apollo服务端的实现

    这篇文章主要介绍了java客户端线上Apollo服务端的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 关于Mybatis使用collection分页问题

    关于Mybatis使用collection分页问题

    项目中mybatis分页的场景是非常高频的,当使用ResultMap并配置collection做分页的时候,我们可能会遇到获取当前页的数据少于每页大小的数据问题。接下来通过本文给大家介绍Mybatis使用collection分页问题,感兴趣的朋友一起看看吧
    2021-11-11
  • spring如何集成cxf实现webservice接口功能详解

    spring如何集成cxf实现webservice接口功能详解

    这篇文章主要给大家介绍了关于spring如何集成cxf实现webservice接口功能的相关资料,文中通过示例代码介绍的非常详细,对大家 的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-07-07
  • 解读为何java中的boolean类型是32位的

    解读为何java中的boolean类型是32位的

    这篇文章主要介绍了为何java中的boolean类型是32位的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java中使用Preferences 的 API设置用户偏好

    Java中使用Preferences 的 API设置用户偏好

    这篇文章主要介绍了Java中使用Preferences 的 API设置用户偏好的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 关于ObjectUtils.isEmpty() 和 null 的区别

    关于ObjectUtils.isEmpty() 和 null 的区别

    这篇文章主要介绍了关于ObjectUtils.isEmpty() 和 null 的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    这篇文章主要介绍了使用LambdaQueryWrapper动态加过滤条件 动态Lambda,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01

最新评论