gpt4 book ai didi

java - 道: diffrence between InMemory implementation and Database Implementation

转载 作者:行者123 更新时间:2023-12-01 10:17:46 26 4
gpt4 key购买 nike

我对 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 Request409 Conflict(视情况而定),如果您正在执行更新操作,则应由 UPDATE 表示(如果没有任何内容需要更新,则返回相当于 404 Not Found 的错误。

因此,虽然 MERGE 符合您的描述,但我不认为它代表 RESTful 操作,因为您应该将操作分离到适当的端点,而不是将它们组合成一个联合体行动。

关于java - 道: diffrence between InMemory implementation and Database Implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com