mybatis如何实现saveOrUpdate
作者:分享心得 发布时间:2021-07-18 10:33:11
标签: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>
来源:https://blog.csdn.net/m0_37539286/article/details/126594466
0
投稿
猜你喜欢
- 知识点:1.使用SQL Helper创建数据库2.数据的增删查改(PRDU:Put、Read、Delete、Update)背景知识:上篇文章
- 一.什么是SemaphoreSemaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueu
- 本文实例讲述了Android编程实现WebView全屏播放的方法。分享给大家供大家参考,具体如下:最近因为项目要用webview加载html
- 下边是一些我们常用的正则表达式。自己写的一些正则表达式,可以先在线测评一下。一、校验数字的表达式 1 数字:^[0-9]*$&nb
- 将map集合存数据与取出数据全部放在一个类MapTest中,方便阅读与查看随便创建一个包,在包中新建一个class文件,(也可以不建包,直接
- 使用通配符增强泛型1.题目泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。实现:在泛型方法中使用通配符2.解题思路创建一个类:
- 关于 LoadLibrary 的疑问Win32 API 中 LoadLibrary 函数的功能是加载某个库文件(通常是 dll 文件),然后
- 本篇使用java自带的MessageDigest实现对文本的md5加密算法,具体代码如下: /** *@Description
- 创建普通Maven工程导入所需依赖坐标:<dependencies> <!-- https://
- // 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1。package demo;publ
- https://www.jb51.net/article/152879.htm上节,我们明白了proc文件系统的作用,接下来我们在已经写好的
- kafka-console-consumer.sh解读kafka-console-consumer.sh 脚本是一个简易的消费者控制台。该
- 0x00:前言参考之前的《MyBatis 中 SqlMapConfig 配置文件详解》记了一下 MyBatis 中的核心配置文件各个标签的作
- 本文实例为大家分享了C语言实现中国象棋的具体代码,供大家参考,具体内容如下运行截图实现思路老套路,二维数组存储棋盘,宏定义各种棋子,每次棋子
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.获取哈希值hashCode()方法可以返回一个对象的哈希
- 本实例是为了实现在管理后台实现微信菜单的添加删除管理。1、首先我们需要新建一个数据库表用于存放menu菜单项可包含的字段有id、父类id、n
- TransactionTemplate的使用总结:在类中注入TransactionTemplate,即可在springboot中使用编程式事
- 我们通常在使用Java 调用脚本的时候,会使用 Runtime 类如:// 打开浏览器并访问 http://localh
- 本文实例为大家分享了Java实现登录和注册的具体代码,供大家参考,具体内容如下登录和注册案例的分析:我们在完成一个需求时,需要面向对象,我们
- 目录前言线程基础1、创建线程2、暂停线程3、线程等待4、线程终止C#中的lock关键字总结前言最近由于工作的需要,一直在使用C#的多线程进行