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
投稿
猜你喜欢
- 使用Integer类型查询出现的问题mapper.xml :<select id="count" paramete
- String类型小数值转为Long类型数值分为小数和整数,当传入的类型为String,需要获取的类型为Long,这时候直接通过Long.va
- 前言static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优
- Java 8的18个常用日期处理一、简介伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API。J
- 一、Spring Bean 集合注入在【Spring学习笔记(三)】已经讲了怎么注入基本数据类型和引用数据类型,接下来介绍如何注入比较特殊的
- 身为程序员我们对线程是再熟悉不过了,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。创建线程也算是一个"重"
- @PropertySource读取配置文件通过@Value参数注入有参数文件如下test.propertiesproject.author=
- 迭代器模式,一直没用过,也不会用。恰巧MyBatis框架中也使用到了迭代器模式,而且看起来还比较简单,在以后的工作中,若有需要咱们可模仿它的
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- Java实现简单的类似QQ聊天工具,供大家参考,具体内容如下所使用到的知识点:java socket编程之TCP协议java Swing简单
- 本文实例讲述了Java接口的简单定义与实现方法。分享给大家供大家参考,具体如下:1、接口是Java中最终要的概念,接口可以理解为一种特殊的类
- 开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教。1.Student
- springmvc @RequestBody String类型参数通过如下配置: <bean id="mapp
- 一、运行class文件执行带main方法的class文件,命令行为:java <CLASS文件名>注意:CLASS文件名不要带文
- Java源码系列三-工具类Arrays今天分享java的源码的第三弹,Arrays这个工具类的源码。因为近期在复习数据结构,了解到Array
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。同X
- 前言在上一篇文章中,我们分析了Spring中Bean的实例化过程,在结尾我们知道了虽然bean的实例化完成了,但是其中的属性还没有被注入,今
- 如下所示:# ===============================================================
- 第一个SpringMvc HelloWorld无启动类springboot才有启动类前端操作访问项目名进入默认主页,显示一个链接点击链接后请
- 最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文