簡體   English   中英

Spring JDBC數據驅動的更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM