繁体   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