簡體   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