orm工具saveOrUpdate()操作设计思路

2024-02-29 22:20

本文主要是介绍orm工具saveOrUpdate()操作设计思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

当我们使用数据库向表中插入数据的时候,经常遇到这样的情况:

  1. 判断数据是否存在;
  2. 如果不存在,则插入;
  3. 如果存在,则更新。

如何设计saveOrUpdate()

当我们手写一个orm工具库的时候,我们都希望尽可能降低API的使用难度,合并更新和插入操作,那么我们应该如何设计saveOrUpdate操作呢?典型地,我们有以下几种思路。

1,利用数据库本身的sql标准

例如mysql的replace into函数。这种做法最简单,但因为绑定mysql数据库,无法做到通用。

replace into 跟 insert 功能类似,不同点在于:replace into首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断),则先删除此行数据,然后插入新的数据。 否则,直接插入新数据。

2,在orm工具的实体类增加一个内存状态字段,表示是否已经存在于数据库

当记录从数据库读取出来,或者插入动作已经执行完毕,则执行更新操作;否则,执行插入操作。

jforgame框架里面的orm工具库采用这种设计思路。

3,利用jdbc的api

orm工具不管数据库有没有存在指定记录,先执行更新操作,如果操作成功,则无须执行插入动作。如果操作失败,则说明当前数据表不存在指定记录,需要执行插入动作。

public interface Statement extends Wrapper, AutoCloseable {// 如果方法返回值大于0,表示此次操作有影响的行数,更新有效int executeUpdate(String sql) throws SQLException {}
}

相应的设计伪代码如下所示:

if (DbUtil.executeUpdate(sql) <= 0) { //执行更新无效DbUtil.executeInsert(sql);   //执行更新插入
}

由于游戏服务器大部分是对实体执行更新操作,这种方式只会对记录第一次插入的时候会有性能影响,多了一步先行判断。

4,动态sql二次判断

跟第三种方式有点类似,首先,需要查询对象是否存在于数据库中。如果对象存在,则执行更新操作;如果对象不存在,则执行插入操作。伪代码如下:

public void saveOrUpdate(MyObject obj) {MyObject existingObj = sqlSession.selectOne("findObjectById", obj.getId());if (existingObj != null) {sqlSession.update("updateObject", obj);} else {sqlSession.insert("insertObject", obj);}
}

5,Hibernate的实现(智能但复杂,且有坑)

Hibernate在执行saveOrUpdate方法时,会根据对象的状态来决定是否进行插入或更新操作。如果对象处于临时状态,即没有关联到任何持久化对象,Hibernate会将该对象插入到数据库中;如果对象处于游离状态,即关联到一个持久化对象,但是没有通过Hibernate的session进行管理,Hibernate会将该对象更新到数据库中。

总之,Hibernate的saveOrUpdate方法是根据对象的标识符来判断对象是临时对象还是持久化对象,并根据对象的状态来决定进行插入或更新操作。

这篇关于orm工具saveOrUpdate()操作设计思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760297

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI