【问题标题】:performing create-or-update with jdbi使用 jdbi 执行创建或更新
【发布时间】:2014-11-10 03:08:51
【问题描述】:

对于一个小的新项目,我决定尝试JDBI(通常我使用hibernate/jpa)。

我喜欢使用 @SqlUpdate/@SqlQuery 的轻量级、基于注释的 dao 创建。

但是:在某些情况下,我不确定是要创建实体还是更新现有实体。 我会放置一个“选择”语句,并根据其返回值使用插入或更新语句。

问题:jdbi 中的“仅接口”dao 是否以某种方式支持这一点?还是我必须自己编写一个“createOrUpdate”方法(使自动生成的 dao 或多或少过时)?

感谢任何提示。

【问题讨论】:

  • 我们需要编写方法来处理这个问题。
  • 所以不支持...“我们”是谁?
  • 你在带注解的接口 DAO 中添加了一个 insert() 和 update() 方法。 CreateOrUpdate() 逻辑通过 select() 和 if/else 在 DAO 上方的层中实现。所以你的问题的答案是:接口DAO不支持“CreateOrUpdate”这个东西。
  • JDBI's Google user group 出现了一些问题。您可以将描述的抽象类解决方案与带注释的抽象方法一起使用,并为“createOrUpdate”方法添加具体实现。非常方便的海事组织。

标签: java jdbi


【解决方案1】:

感谢@zloster,我现在构建了一个基于抽象类而不是接口的解决方案。按要求工作。

@SqlUpdate("insert ...")
public abstract void insert(...);

@SqlUpdate("update...")
public abstract void update();

public X createOrUpdate(final X x) {
    if (!exists(x)) {
        insert(x);
    } else {
        update(x);
    }
    return find(...);
}

【讨论】:

  • 一个稍快的变体是使用更新中的更新计数来检查行是否存在,如果不存在,则插入。如果(更新(x)== 0){插入(x); } 这可以避免存在的调用。
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2018-05-17
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多