我很困惑实现了用于DAODatabase(用于Oracle 11 xe)的CRUD方法。 问题是,在通常存储到Map集合的情况下,方法(更新)会在Map集合中插入新元素或将其更新(键值数据,如ID:AbstractBusinessObject
)。当你写下类似myHashMap.add(element)
的东西时,你并不关心它。这种方法(更新)广泛用于项目的业务逻辑。DAO:InMemory实现和数据库实现之间的区别
显然,在使用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函数(当然,approriate参数),这和通过Java
称之为 - 或者我应该简单地处理系列查询preparedStatements
,并通过.executeUpdate/.executeQuery
进行查询?我是否应该处理整个UPSERT
SQL代码中的一个preparedStatment
或将其拆分为一个方法体内的几个SQL查询和准备语句? (我正在使用Tomcat的连接池,并通过静态方法getConnection()
将连接实例传递给DAODatabase
中的每个方法实现)?
有没有解决UPSERT
任务的另一种可能性?