繁体   English   中英

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

[英]Concurrently retrieve or create new row using JDBI SQL Object API

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

是否可以使用没有任何存储过程的SQL Object API来执行此操作?

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

如果要将其合并到DAO类中的单个方法中,则可以使其成为抽象类而不是接口,然后可以使用包含所需逻辑的具体方法,并对其进行注释以使其在事务中发生:

  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);

  }

若要正确执行此操作,您需要处理数据库内部的并发。 创建其中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;

如果始终运行额外的插入是性能方面的考虑,则可以先执行读取,并且仅在记录不存在时才插入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM