[英]Spring JDBC Data Driven Update
我有一個Spring應用程序,它具有Postgres數據庫的更新API端點。 用戶可以提交信息,更新將反映在數據庫中。 用戶只提交他們必須更新的內容。 例如,考慮以下對象:
class Dog {
String name;
int age;
String breed;
// Attributes and getters/setters...
}
當用戶提交更新請求時,他們只發送他們希望更新的信息,例如僅發送名稱和品種。 我有以下功能,用信息更新數據庫:
public void update(String name, int age, String breed, JdbcTemplate template) {
UpdateBuilder query = new UpdateBuilder();
query.from("DogTable");
boolean updated = false;
if (name != null) {
query.set("name" + " = '" + name + "'");
updated = true;
}
if (age != null) {
query.set("age" + " = '" + age + "'");
updated = true;
}
if (breed != null) {
query.set("breed" + " = '" + breed + "'");
updated = true;
}
// And so on...
if (updated) {
query.set("UpdatedTime" + " = '" + new Date() + "'");
}
query.where("someKey" + " = '" + someId + "'");
template.update(query.toString());
}
( query.set()
東西只是一個構建查詢字符串的輔助類)
正如你所看到的那樣,所有“給出的名字是給定的年齡?”會變得混亂。 檢查。 這引出了我的問題:是否有數據驅動的方法來做到這一點? 我希望能做的是:
myJdbcTemplate.update(ListOfObjectsToUpdate, "TableName");
簡單地說,JDBC模板將看到我提供的內容,並將繼續使用該信息更新提供的表。 這甚至可能嗎? 我意識到使用字符串構建查詢很糟糕,但PreparedStatements在代碼中看起來並不好(更不用說,它們沒有解決這個問題)。
您可以為此目的使用COALESCE函數 - 添加用戶值和現有值,如果用戶值不為null(預期更新),則可以將其設置為新值。
與此類似 -
UPDATE "user" SET alternate_contact_name = COALESCE(<user value>, alternate_contact_name)
這是一個MySQL查詢,但COALESCE
在Postgresql中的工作方式相同
如果user value
不為null,則將設置user value
和新值。 如果為null且column的原始值不為null,則選擇原始值。 如果兩者都為null則無關緊要。
通過這種方式,您可以簡單地傳遞所有參數,避免以不整齊的方式構建查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.