我对DAODatabase(适用于Oracle 11 xe)的 CRUD 方法的实现感到困惑。
问题是," U" -method(更新)如果通常存储到Map集合中,则插入新元素或更新它(键值数据如{{ 1)})在Map集合中。当你写ID:AbstractBusinessObject
之类的东西时,你并不关心它。此方法(更新)广泛用于项目的业务逻辑中。
显然,在使用Oracle的情况下,我必须关心现有元素的插入和更新。但我很乐意选择如何实施它的方式:
Oracle中所谓的myHashMap.add(element)
没有内在功能(至少在xe11g r2版本中)。但是,我可以通过SQL查询模拟必要的函数,如下所示:
UPSERT
通过使用这种查询(首先 - 插入,第二次 - 更新)我假设数据大多数将被插入而不是更新(至少它会相当罕见)。(可能是不是最佳的并发性?)。
好的,有可能。但在这一点上,我很难决定:
- 我应该为此编写一个SQL函数(当然还有approriate参数)并通过Java调用它
- 或者我应该只为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)
处理一系列查询并通过preparedStatements
进行查询?我应该为一个.executeUpdate/.executeQuery
处理整个UPSERT
SQL代码,还是将它分成几个SQL查询并在一个方法体内编写语句? (我使用Tomcat的连接池,并通过静态方法preparedStatment
将连接实例传递给getConnection()
)中的每个方法实现?
还有其他可能解决DAODatabase
任务吗?
答案 0 :(得分:1)
等同于您的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
表示(如果没有任何内容可以更新,则将等效错误返回到{{ 1}}。
所以,虽然404 Not Found
符合您的描述,但我并不认为它代表了RESTful行动,因为您应该将行动分离到适当的终点,而不是将其合并为一个联合行动