- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 DAODatabase(适用于 Oracle 11 xe)的 CRUD 方法的实现感到困惑。问题是,在通常存储到 Map 集合的情况下,“U”方法(更新)会插入新元素或更新它(像 ID:AbstractBusinessObject< 这样的键值数据
) 在 Map 集合中。当您编写类似 myHashMap.add(element)
的内容时,您并不关心它。该方法(update)广泛应用于项目的业务逻辑中。
显然,在使用 Oracle 的情况下,我必须关心现有元素的插入和更新。但我坚持选择如何实现它的方式:
Oracle 中没有所谓的 UPSERT
的内在函数(至少在 xe11g r2 版本中)。但是,我可以通过 SQL 查询来模拟必要的功能,如下所示:
INSERT INTO mytable (id1, t1)
SELECT 11, 'x1' FROM DUAL
WHERE NOT EXISTS (SELECT id1 FROM mytble WHERE id1 = 11);
UPDATE mytable SET t1 = 'x1' WHERE id1 = 11;
(src:http://stackoverflow.com/a/21310345/2938167)
通过使用这种查询(第一次 - 插入,第二次 - 更新),我认为数据大部分将被插入而不是更新(至少会相当罕见)。(可能是这样)并发性不是最佳的?)。
好吧,这是可能的。但此时我很难决定:
-- 我应该为此编写一个 SQL 函数(当然带有适当的参数)并通过 Java 调用它
--或者我应该简单地处理 preparedStatements
的一系列查询并通过 .executeUpdate/.executeQuery
执行它们?我应该处理一个 preparedStatment
的整个 UPSERT
SQL 代码,还是将其拆分为多个 SQL 查询和一个方法体内的准备好的语句? (我正在使用 Tomcat 的连接池,并通过静态方法 getConnection()
将连接实例传递给 DAODatabase
中的每个方法实现)?
还有其他可能性来解决UPSERT
任务吗?
最佳答案
相当于您的 UPSERT
语句似乎是使用 MERGE
:
MERGE INTO mytable d
USING ( SELECT 11 AS id, 'x1' AS t1 FROM DUAL ) s
ON ( d.id = s.id )
WHEN NOT MATCHED THEN
INSERT ( d.id, d.t1 ) VALUES ( s.id, s.t1 )
WHEN MATCHED THEN
UPDATE SET d.t1 = s.t1;
您还可以使用(或包装在过程中):
DECLARE
p_id MYTABLE.ID%TYPE := 11;
p_t1 MYTABLE.T1%TYPE := 'x1';
BEGIN
UPDATE mytable
SET t1 = p_t1
WHERE id = p_id;
IF SQL%ROWCOUNT = 0 THEN
INSERT INTO mytable ( id, t1 ) VALUES ( p_id, p_t1 );
END IF;
END;
/
但是,当您处理 CRUD 请求时 - 如果您正在执行 Create 操作,那么它应该由 INSERT
表示(如果某些内容已经存在,那么您应该抛出与HTTP 状态代码 400 Bad Request
或 409 Conflict
(视情况而定),如果您正在执行更新操作,则应由 UPDATE
表示(如果没有任何内容需要更新,则返回相当于 404 Not Found
的错误。
因此,虽然 MERGE
符合您的描述,但我不认为它代表 RESTful 操作,因为您应该将操作分离到适当的端点,而不是将它们组合成一个联合体行动。
关于java - 道: diffrence between InMemory implementation and Database Implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798759/
我正在设置我的测试框架,以针对不同的场景使用内存数据库。每个测试都使用一个“唯一”的数据库,测试的每个步骤都使用不同的 Entity Framework 上下文。 问题是,即使测试使用不同的“内存中”
我正在使用 CSharpCodeProvider 编译程序集,并且我将 CompileParameters GenerateInMemory 属性设置为 true因为我不想创建物理文件。 编译后,我可
我尝试使用 EF7 InMemory 提供程序进行单元测试,但测试之间 InMemory 数据库的持久性给我带来了问题。 以下代码演示了我的问题。一个测试会起作用,而另一个测试总是会失败。即使我在测试
我正在尝试按照 Apache 中的说明设置 OpenCMIS InMemory 存储库但在运行maven命令mvn clean install -Dmaven.test.skip=true时不断收到以
这是我的集成测试代码: [Fact(DisplayName = "Should only add AssetType when Name Provided")] public async Task T
SQLite InMemory DB 和 Temporary DB 有什么区别? 引用:Temporary DB 虽然我认为临时数据库是磁盘支持的文件数据库,但文档有点令人困惑,因为它说临时数据库与内
运行所有测试时,我最终收到错误消息: "An item with the same key has already been added. Key: 125" 当每个测试单独运行时,这不会发生。 有趣
我目前正在使用内存数据库 测试 Entity Framework DbContext。 为了使测试尽可能原子化,每个测试方法的 DbContext 都是唯一的,并且填充了每个测试所需的初始数据。 为了
我正在尝试在内存 Realm 中使用来存储一些对象。我通常在辅助线程中保存对象并在主线程中请求对象。 我还需要对内存中的 Realm 有一个强引用,以避免数据丢失。 static private va
我有一个遗留的 C 库,它接受一个文件,处理文件负载并将处理后的负载写入输出文件。库中的函数与 FILE 紧密耦合,即它将 FILE 句柄传递给函数,函数执行文件 IO 以检索必要的数据。 我想修改这
我对 DAODatabase(适用于 Oracle 11 xe)的 CRUD 方法的实现感到困惑。问题是,在通常存储到 Map 集合的情况下,“U”方法(更新)会插入新元素或更新它(像 ID:Abst
您好,我在 OAuth2 中刷新 token 时遇到问题。 为了获取新 token ,我使用以下请求:{{host}}/oauth/token?grant_type=refresh_token&ref
我正在为使用 EntityFramework Core 并根据 docs 的项目编写单元测试。我可以使用 SQLite 内存模式 或 The InMemory provider 来近似数据库上下文。
我正在学习着名的 Angular 教程,英雄之旅,但我正在努力迈出一步。 关于 sixth course, HTTP ,我们正在使用一种工具来模拟对 API 的 API 调用。 我想我遵循了所有步骤,
我正在尝试使用 InMemory EF7 数据库进行我的 xunit 存储库测试。 但我的问题是,当我尝试处置创建的上下文时,内存中的数据库仍然存在。这意味着一个测试涉及另一个。 我读过这篇文章Uni
我想用我的测试模型的结构创建一个数据库。在内存中。使用 Sqlite 和 Entity Framework Core。当然,先写代码。我创建了我的模型。 数据\DataContext.cs: usin
以下代码抛出异常: System.InvalidOperationException: The instance of entity type 'DimEntity' cannot be tracke
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在自定义 WebApplicationFactory 以使用原始应用程序项目中的 Startup、appsettings。 目的是创建指向原始应用程序启动的集成测试。 dbcontext 的 ap
我正在尝试为我使用 graphql-dotnet 的小型 GraphQL 服务器编写集成测试。当我使用我的 Web 应用程序时,服务器工作正常。 为了运行集成测试,我尝试使用 Microsoft.As
我是一名优秀的程序员,十分优秀!