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

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密