使用 JDBI SQL 对象 API 同时检索或创建新行

Concurrently retrieve or create new row using JDBI SQL Object API

我正在使用 JDBI 并想使用 SQL Object API 以便在给定字段值的情况下搜索该值是否存在一行,return 如果找到它的键,则创建如果未找到它和 return 生成的密钥(与 MySQL 数据库交谈)。

是否可以在不使用任何存储过程的情况下使用 SQL 对象 API 来执行此操作?

JDBI SQL 对象 API 中没有魔法可以为您完成此操作。您将需要几个 SQL 语句,就像在存储过程中一样。

如果你想在你的 DAO class 中将它组合成一个单一的方法,你可以使它成为一个抽象 class 而不是一个接口,然后它可以有一个包含逻辑的具体方法您需要并注释以使其在事务中发生:

  public abstract class MyDAO {

    @Transaction
    public long getId(String value) {
      Thing thing = findByValue(value);
      if (thing != null) {
        return thing.getId();
      } else {
        return addNewRecord(value);
      } 

    }

    @SqlQuery("select * from mytable where value = :value")
    public Thing findByValue(@Bind("value") String value);

    @SqlUpdate("insert into mytable (value) values (:value)")
    @GetGeneratedKeys
    public long addNewRecord(String value);

  }

要正确执行此操作,您需要处理数据库内部的并发性。创建 table 其中 value 是唯一索引:

CREATE TABLE mytable (
  id bigint NOT NULL PRIMARY KEY,
  value varchar(100) NOT NULL UNIQUE
);

然后您可以使用 MySQL 的 INSERT IGNORE 语法,它会跳过重复键等错误:

INSERT IGNORE INTO mytable VALUES (:value);

插入后,读取行:

SELECT * FROM mytable WHERE value = :value;

如果总是 运行 额外的插入是一个性能问题,您可以先执行读取,然后仅在记录不存在时才插入。