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

时间:2016-01-21 22:16:08

标签: java json spring postgresql

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

  • 我有一个案例,我带了一个Json对象item

  • uri是/api/item/{itemId}

  • 请求类型为PUT

杰森:

{
   "name":"itemname",
   "description":"item description here"
}

所以我(使用JdbcTemplate)使用SELECT语句来检查itemId是否存在,然后更新它是否存在。

我还想实现一个使用Json的部分put的情况,看起来像这样::

{
   "name":"itemname"
}

OR

{
   "description":"item description here"
}

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

现在实施的方式是:

  1. SELECT items
  2. 中的所有列
  3. 按顺序检查每个预期变量是否为null,如果它们为null,则将null替换为从步骤1中的表中选择的值。
  4. UPDATE所有包含值的列(如果表格有null约束,则不应为not null
  5. 问题:如果没有== null or != null检查,你怎么做?似乎是糟糕的设计,并涉及迭代每个PUT请求的每个预期变量(我会有很多这样的请求)。

    期望的回应(按照可取的顺序):

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

1 个答案:

答案 0 :(得分:0)

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

  1. 只需更新已更改的内容,自行完成所有操作。
  2. 让Jackson和Hibernate为你做这件事。
  3. 让我们看看第1号: 假设您现在正在查看已发送回服务器的html form的内容。获取html表单中的每个字段,并使用SQL语句仅更新数据库中的那些字段。表单中没有的任何内容都不会在数据库表中更新。简单!效果很好。您不必担心表单中没有的任何内容。您可以将更新限制为表单的内容。

    一般来说,这是一个简单的选项,除了一个问题,即 html复选框。如果你正在进行更新,html复选框可能会让你失望,因为由于一点设计怪癖,如果取消选中它们,它们就不会被发送回服务器。

    没有。 2:也许你正在寻找你没有提到的Hibernate。杰克逊将为你填写一个json对象(必须有一个记录ID)。使用Hibernate用现有记录填充java类,使用Jackson提供的新值进行更新,然后告诉Hibernate将它合并()到数据库中的现有记录中。我也使用Roo为我创建我的Hibernate-ready类。

    没有。 2很难学习和设置,但是一旦你完成了它,它就很容易改变,添加字段等等。