Mybatis save、saveOrUpdate、update的区别

哈喽,大家好,我是木头左!

1. save方法

Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会抛出异常。

int result = sqlSession.insert("userMapper.save", user);

2. saveOrUpdate方法

Mybatis的saveOrUpdate方法用于插入或更新一条记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。

int result = sqlSession.insert("userMapper.saveOrUpdate", user);

3. update方法

Mybatis的update方法用于更新一条记录。当数据库中存在相同的记录时,会执行更新操作;如果不存在相同的记录,则不会执行任何操作。

int result = sqlSession.update("userMapper.update", user);

4. 区别总结

  • save方法只适用于插入操作,如果数据库中已经存在相同的记录,会抛出异常。
  • saveOrUpdate方法既可以用于插入操作,也可以用于更新操作,当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。
  • update方法只适用于更新操作,如果数据库中不存在相同的记录,则不会执行任何操作。

通过以上介绍,可以看到save、saveOrUpdate和update方法在Mybatis中的不同作用。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作。同时,也可以通过设置主键策略来避免重复数据的问题,从而更好地使用Mybatis的这些方法。

5. 主键策略设置

5.1 自增主键

当使用自增主键时,可以保证每条记录的主键都是唯一的,因此可以直接使用save或saveOrUpdate方法进行插入或更新操作。例如:

<insert id="insertUser" parameterType="com.example.User">INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

5.2 非自增主键

当使用非自增主键时,需要确保数据库中没有重复的主键值,否则会抛出异常。此时,可以使用以下两种方法来处理:

  • 先查询再判断:在执行插入或更新操作之前,先查询数据库中是否存在相同的主键值。如果存在,则不执行操作;如果不存在,则执行插入或更新操作。这种方法的缺点是可能会影响性能,因为需要多次查询数据库。例如:
User user = getUserById(id);
if (user == null) {user = new User();user.setId(id);user.setName(name);user.setAge(age);sqlSession.insert("userMapper.insert", user);
} else {sqlSession.update("userMapper.update", user);
}
  • 使用主键策略:在Mybatis的配置文件中设置主键策略为“NOT_NULL”,这样当数据库中不存在相同的主键值时,会自动生成一个新的主键值并执行插入或更新操作;如果已经存在相同的主键值,则会抛出异常。这种方法的优点是简单方便,但缺点是无法自定义主键生成逻辑。例如:
<insert id="insertUser" parameterType="com.example.User">INSERT INTO user (id, name, age) VALUES (#{id,jdbcType=INTEGER}, #{name}, #{age}) ON CONFLICT DO NOTHING;
</insert>

通过以上介绍,可以看到Mybatis save、saveOrUpdate和update方法在不同主键策略下的使用方法。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作,并根据主键策略来避免重复数据的问题。同时,也可以通过设置事务管理来确保数据的一致性和完整性,从而提高系统的可靠性和稳定性。

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SAP-ABAP】-权限批导-批量分配角色给具体用户

需求&#xff1a;SAP期初上线的时候&#xff0c;业务顾问经常会遇到批量创建角色和分配角色权限的情况 岗位需求&#xff1a;一般是业务顾问定义权限&#xff0c;BASIS进行后期运维&#xff0c;今天讲两个批导功能&#xff0c;方便期初上线 此程序功能&#xff1a;给具体用户…

计算各聚类中心

任务描述 本关实现一个函数来计算各簇的中心。 相关知识 在前一个关卡中&#xff0c;我们实现了一个函数来计算距离每个样本最近的簇中心&#xff0c;这样每一个样本都有了所属的簇团&#xff0c;从而将一堆数据分成了 n 个簇&#xff0c;也就是 n 个类。 K-means 算法是一…

leetcode打卡#day41 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 class Solution { public:int fib(int n) {if (n 0) return 0;if (n 1) return 1;return fib(n-1) fib(n-2);} };70. 爬楼梯 class Solution { public://动态规划 -- 爬楼梯int climbStairs(int n) {if (n < 1) return n; //防止空指针vector<int&g…

【Go】十三、TOKEN机制与跨域处理方式

身份校验 对于微服务场景来说&#xff0c;使用 cookie session 来进行身份校验是一种不合适的做法&#xff0c;因为 生成的sessionid 是不存储任何信息的&#xff0c;这样我们如果要在其他模块中进行身份校验就是做不到的&#xff0c;例如&#xff1a;我们无法在商品模块中筛…

Android Unable to determine activity name

报错:Unable to determine activity name的解决办法 最新的Android Studio长颈鹿版(Android Studio Giraffe | 2022.3.1 Patch 4) 新建一个空白的Activity,只能选kotlin. 选No Activity,则可以选Java语言。 新建好后,不像以前的老版本,点击运行,可以直接进入Hello wor…

电脑桌面提醒做事的app 好用的桌面提醒app

在快节奏的现代生活中&#xff0c;我们每天都要通过电脑处理大量的工作事项。然而&#xff0c;繁忙的工作节奏有时会导致我们遗忘某些重要任务&#xff0c;从而带来不必要的损失。为了避免这种情况&#xff0c;选择一款好用的桌面提醒app显得尤为重要。 想象一下&#xff0c;你…

世界上最顶级的动画公司是哪个?基于什么技术?

世界上最顶级的动画公司之一是皮克斯动画工作室&#xff08;Pixar Animation Studios&#xff09;。皮克斯以其技术创新、卓越的动画质量和强大的故事叙述能力闻名。下面是皮克斯的一些关键技术和创新&#xff1a; 1. 计算机动画&#xff08;CGI&#xff09;&#xff1a; 皮…

C语言| 数组

直接定义一个数组&#xff0c;并给所有元素赋值。 数组的下标从0开始&#xff0c;下标又表示数组的长度。 【程序代码】 #include <stdio.h> int main(void) { int a[5] {1, 2, 3, 4, 5}; int i; for(i0; i<5; i) { printf("a[%d] %d\…

主窗体获取子窗体的数值

本文所描述的是一个modbus读从站的数值实时更新到主窗体中&#xff0c;在主窗体中实时检测子窗体反馈回来的数据当它为false的时候添加报警输出 在主窗体中 //公开一个静态的字典用来接收数值 public static Dictionary<string, bool> StatusDictionary { get; set; }p…

翻译: Gen AI生成式人工智能学习资源路线图一

Introduction 介绍 本文档旨在作为学习现代人工智能系统背后的关键概念的手册。考虑到人工智能最近的发展速度&#xff0c;确实没有一个好的教科书式的资源来快速了解 LLMs 或其他生成模型的最新和最伟大的创新&#xff0c;但互联网上有大量关于这些主题的优秀解释资源&#x…

WireGuard网络架构及配置详解

WireGuard网络架构及配置详解 一.点对点二.中心网关,实现nat穿透弊端:流量全部经过中心网关,带宽上限受限于中心网关 三.借助registry实现双向nat穿透需要借助registry实现 udp打洞, 待二开 一.点对点 yum install epel-release elrepo-release -y yum install yum-plugin-elr…

QT——事件

一、什么是事件 在QT中,事件(Event)是指由特定对象发生的动作或状态变化,通常用于响应用户的操作。事件可以是鼠标点击、键盘输入、窗口移动等用户操作,也可以是系统发出的信号,比如定时器超时、网络数据到达等。在QT中,可以通过连接信号与槽(Signals and Slots)的方…

蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI

在2024年全球开发者大会&#xff08;WWDC 2024&#xff09;上&#xff0c;苹果公司首席执行官蒂姆库克&#xff08;Tim Cook&#xff09;隆重介绍了公司的最新人工智能&#xff08;AI&#xff09;计划——Apple Intelligence&#xff0c;并宣布了与OpenAI的ChatGPT的合作。虽然…

知识图谱存在的挑战---数据相关和算法相关

文章目录 数据相关算法相关 数据相关 数据是知识图谱的基石,知识图谱的数据来源主要有两种&#xff1a;自有数据&#xff08;自身采集 或拥有等&#xff09;和外源数据。自有数据由建设者因特定的业务需求而采集获取或经过特定加工处理形成且被自己所拥有的数据&#xff1b;外源…

kotlin 协程之初识挂起函数

什么是挂起函数 官方文档 在 Kotlin 协程:从基础概念到开发实践 文章中,提到 kotlin协程 是一个可挂起计算的实例,可以在一个线程中挂起并在另一个线程中恢复继续执行,这期间不会阻塞线程。 这种挂起和恢复的能力就是通过挂起函数来实现的。 在使用示例中,我们用到了 w…

定时器0电机控制PWM输出

/*立式不锈钢波纹管机控制板2021 2 26 pcb PAST******/ #include <REG52.H> #include <intrins.H> #define uint unsigned int #define uchar unsigned char #define …

vue使用

if (this.$isPGY) {typeof window.tabCreateFn "function" && window.tabCreateFn("对账单 - 新增", "/vues/account/add", "")} else {this.$router.push({ name: "AccountAdd" })}

JVM性能优化案例:优化垃圾回收器的年轻代和老年代占比

JVM性能优化案例&#xff1a;优化垃圾回收器的年轻代和老年代占比 我们有一款在线交易系统&#xff0c;要求低延迟和高吞吐量。系统运行在Ubuntu服务器上&#xff0c;使用OpenJDK 11&#xff0c;并启用了G1垃圾回收器。以下是系统的基本配置和GC日志信息&#xff1a; 操作系统…

vscode react我常用的开发插件汇总

console-log – 此插件用于快捷键生成console,当然你也可以在其他模板中自定义快捷生成内容CodeGeeX – 一个内嵌在vscode插件列中的AI工具,让我们可以直接获取AI信息而不必麻烦的到其他AI软件或平台搜索Git History – 此插件用于在vscode中提供一个查询当前选中tab页签的组件…

CID引流电商下的3C产品选品策略深度解析

​摘要&#xff1a;随着电商行业的迅猛发展和消费者需求的日益多样化&#xff0c;CID引流电商作为一种新兴的电商模式&#xff0c;逐渐受到了广泛关注。在这一模式下&#xff0c;3C产品作为高客单价、高技术含量的代表品类&#xff0c;其选品策略的制定显得尤为重要。本文将从多…