DAO:InMemory实现与数据库实现之间的差异

时间:2016-03-04 14:40:08

标签: java oracle upsert

我对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任务吗?

1 个答案:

答案 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 Request409 Conflict,如果您正在执行更新操作,它应该由UPDATE表示(如果没有任何内容可以更新,则将等效错误返回到{{ 1}}。

所以,虽然404 Not Found符合您的描述,但我并不认为它代表了RESTful行动,因为您应该将行动分离到适当的终点,而不是将其合并为一个联合行动