Java HTTP使用部分Json更新数据库-Spring,Postgres

Java HTTP使用部分Json更新数据库-Spring,Postgres,java,json,spring,postgresql,Java,Json,Spring,Postgresql,我正在使用Spring和Postgres编写一个web api 我有一个例子,我使用Json对象item uri是/api/item/{itemId} 请求类型为PUT Json: { "name":"itemname", "description":"item description here" } 因此,我(使用JdbcTemplate)执行一个SELECT语句来检查itemId是否存在,如果存在则进行更新 我还想实现一个使用Json的部分puts的案例,如下所示: {

我正在使用Spring和Postgres编写一个web api

  • 我有一个例子,我使用Json对象
    item

  • uri是
    /api/item/{itemId}

  • 请求类型为
    PUT

Json:

{
   "name":"itemname",
   "description":"item description here"
}
因此,我(使用JdbcTemplate)执行一个
SELECT
语句来检查
itemId
是否存在,如果存在则进行更新

我还想实现一个使用Json的部分puts的案例,如下所示:

{
   "name":"itemname"
}

其中仅更新相应的字段。在Spring中,不存在的变量将自动
null

目前的实施方式是:

  • 项目
    表中选择所有列
  • 按顺序检查每个预期变量是否为null,如果为null,则用步骤1中从表中选择的值替换null
  • UPDATE
    包含值的所有列(如果表具有
    notnull
    约束,则所有列都不应为
    null
  • 问题:如果没有
    ==null或!=空
    检查?Is似乎是糟糕的设计,涉及到对每个
    PUT
    请求的每个预期变量进行迭代(我将有很多这样的请求)

    期望的响应(按照期望的顺序):

  • 在Postgres中有一种方法,如果输入
    null
    值,列值就不会写入数据库(并且不会产生错误)
  • 有一种方法可以使用Spring(和Jackson)创建一个只包含提供的值的Java对象,还有一种方法可以生成只更新那些特定列的SQL和JdbcTemplate代码
  • 补丁是生活的方式-实现它
  • 将前端更改为始终发送所有内容

  • 使用数据库时有两种选择:

  • 只需更新已更改的内容,自己做所有事情
  • 让Jackson和Hibernate为你做这件事
  • 让我们看看第一条: 假设您现在正在查看已发送回服务器的html
    表单的内容。获取html表单中的每个字段,并使用SQL语句仅更新数据库中的这些字段。表单中未包含的任何内容都不会在数据库表中更新。简单!效果很好。你不必担心表格中没有的东西。您可以限制对表单内容的更新

    一般来说,这是一个简单的选项,除了一个问题,即html复选框。如果您正在进行更新,html复选框可能会让您感到困惑,因为由于一点设计缺陷,如果未选中它们,它们不会被发送回服务器

    第二:也许你在找Hibernate,你没有提到。Jackson将为您填充一个json对象(必须有记录id)。使用Hibernate使用现有记录填充java类,使用Jackson提供的新值进行更新,然后告诉Hibernate()将其合并到数据库中的现有记录中,它将这样做。我还使用Roo为自己创建Hibernate就绪类


    第2项很难学习和设置,但一旦使用了它,就很容易更改内容、添加字段等。

    在Postgres中创建表时,您可能会发现默认属性很有用。例如,您可能有这样一个字段定义:numberofpeople默认值为0。如果您的所有字段都有默认值,那么您不必担心您的“人数”字段是否不在要插入数据库的字段中。Postgres只需将字段设置为默认值。是否将默认值设置为当前值,以便传入null时保留默认值?您的意思是,如果发送null,是否有方法将字段保持为当前值?不,据我所知没有。然而,当我提到默认关键字时,我们指的是新的记录插入,当然不是更新。我没有做任何插入。只有更新。
    {
       "description":"item description here"
    }