mybatis如何实现saveOrUpdate

目录
  • 1. selectKey标签查询
  • 2. 主键自增或者累加的,不使用selectKey
  • 3. 主键为varchar的使用ON DUPLICATE KEY UPDATE
  • 总结

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>

总结

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

(0)

相关推荐

  • mybatis-plus 关于savebatch,saveorupdatebatch遇到的坑及解决办法

    目录 一.背景 二.解决办法 三.sql注入器实现批量更新,批量新增或更新功能 一.背景 最近mybatis-plus框架的更新,让我们基础开发中如虎添翼.其中基本的增删改查,代码生成器想必大家用着那叫一个爽.本人在使用中,也遇到一些坑.比如savebatch,saveorupdatebatch,看着这不是批量新增,批量新增或更新嘛,看着api进行开发,感觉也太好用啦.开发完一测试,速度跟蜗牛一样,针对大数据量真是无法忍受.在控制台上发现,怎么名义上是批量插入,还是一条一条的进行插入,难怪速度龟

  • Mybatis-Plus使用saveOrUpdate及问题解决方法

    今天的想法是,要在插入数据库时,如果有某某一个主要字段的值重复,则不插入,否则则插入!看了一下mybatis-Plus是有这个saveOrUpdate 方法! 原本使用save时是没有问题了,改成saveOrUpdate 用了一下就报错了. com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: error: can not execute. because can not find column for id from en

  • mybatis如何实现saveOrUpdate

    目录 1. selectKey标签查询 2. 主键自增或者累加的,不使用selectKey 3. 主键为varchar的使用ON DUPLICATE KEY UPDATE 总结 1. selectKey标签查询 DDL CREATE TABLE `luck_reward_info` (   `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',   `activity_id` varchar(20) CHARACTER SET utf8mb4 COLLATE

  • Mybatis Plus使用条件构造器增删改查功能的实现方法

    java后端层级结构 Controller 接口层 接口层比较好理解,它是面向web网络的接口,使用http格式去调用 /** * 图文课程管理Controller */ @RestController @RequestMapping("/driver/imageCourse") public class TImageCourseController extends BaseController { @Autowired private ITImageCourseService tIm

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    目录 前言 查询 查询写法1 查询写法2 代码说明 新问题 删 总结 前言 接着上一篇:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上 仓库地址:GitHub仓库 查询 定义查询请求体 package com.hy.fmp.dto.req; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** @

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    目录 前言 Maven依赖 配置文件调整 Knife4j配置 添加必要实体 增/改 总结 前言 接着上一篇,上篇已经测试通过,成功添加了数据.那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口. GitHub代码仓库:GitHub仓库 Maven依赖 增加了druid数据库连接池,所以之前的配置文件也需要调整,下面会发出来. <dependency> <groupId>cn.hutool</groupId> <artifac

  • mybatis@insert 注解如何判断insert或是update

    目录 @insert注解判断insert或update @insert 注解 实现insert Or update的操作 selectKey有以下几个属性 @insert注解判断insert或update 最近参与研发了一个项目,需要用到mybatis,和我之前接触的不同,我们的sql语句并没有写在xml中,而是使用的注解. 所以在此做个笔记方便以后查找. @insert 注解 简单的就不多说主要是有个业务需求,当一条数据存在时update ,不存在时insert,这时就会用到 ON DUPLI

  • mybatis 模糊查询的实现方法

    mybatis 模糊查询的实现方法 mybatis的逆向助手确实好用,可以省去很多编写常规sql语句的时间,但是它没办法自动生成模糊查询语句,但开发中模糊查询是必不可少的,所以,需要手动对mapper编写模糊查询功能. 这里先明确MyBatis/Ibatis中#和$的区别: 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解

  • Oracle结合Mybatis实现取表TOP 10条数据

    之前一直使用mysql和informix数据库,查表中前10条数据十分简单: 最原始版本: select top * from student 当然,我们还可以写的复杂一点,比如外加一些查询条件? 比如查询前10条成绩大于80分的学生信息 添加了where查询条件的版本: select top * from table where score > 80 但是!!oracle中没有top啊!!!!那么该如何实现呢? 嗯,可以用rownum! oracle中原始版本 select * from st

  • 基于Angularjs+mybatis实现二级评论系统(仿简书)

    一直想写个评论系统,看了下多说,网易,简书的评论,想了下自己该实现怎样的评论系统. 评论系统关键是嵌套层数以及数据库表设计.嵌套层数多,表结构复杂,呈现也麻烦,最后决定实现一个二级评论.系统由maven构建,springboot快速搭建spring环境.前台采用angularjs+bootstrap,后台使用springmvc+mybatis,数据库采用MySQL.前台请求后台API操作评论. 目录结构 数据库表设计 ##说说表或者文章表 create table saying ( saying

  • AngularJS整合Springmvc、Spring、Mybatis搭建开发环境

    最近想学习AngularJS的使用,网上搜了一圈后,折腾了半天解决bug后,成功使用AngularJS整合Springmvc.Spring.Mybatis搭建了一个开发环境.(这里Spring使用的版本是4.0.6,Mybatis版本是3.2.5,AngularJS的版本是1.0.3) 第一步:创建一Maven项目,在pom.xml下添加需要的包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

随机推荐