![](/img/trans.png)
[英]How do I create a Dynamic Sql Query at runtime using JDBI's 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.