如何实现http补丁逻辑

how to implement http patch logic

我正在使用 java、spring mvc 和 mybatis。

对于http patch,它用于更新部分资源,而put更新整个资源。

我的代码看起来像

@RestController
@RequestMapping("/test")
public class Test {
@PutMapping
public void update(MyBean myBean) {
    //update MyBean
}

mybatis代码为:

<update id="updateMyBean">
    update My_Bean
    <set>
        <if test="filed1 != null>field1 = #{field1},</if>
        <if test="filed2 != null>field1 = #{field2},</if>
        <if test="filed3 != null>field1 = #{field3},</if>
    </set>
    where id = #{id}
</update>

那么如何在spring mvc中实现patch?如何在mybatis中实现patch

是否添加了如下更新方法?

@PutMapping
public void update(MyBean myBean) {
    //update MyBean
}

@PatchMapping
public void updateBeanPartial(MyBean myBean) {
    //update MyBean
}
//they look like the same just annotations and/or method name are different
or
@PatchMapping
public void updateBeanPartial(Map myBeanMap) {
    //update MyBean
}
//use Map as parameters, but in this case, we cannot do bean validation easily and cannot show what fields need to be sent in swagger

//or use specified fields of MyBean as parameter, but it will introduce many controller methods because MyBean can have many fields

他们使用相同的 mybatis update 语句?

那么,如何在代码中实现putpatch呢? 还是它们的区别仅在于语义而不在于代码?

让我们先澄清一些事情:

  • 更新:如果 Bean (MyBean) 有多个字段,那么你创建 1 SQL 语句来更新你的 batis 中的所有字段。

  • 补丁:如果Bean (MyBean)有多个字段,那么你创建1个SQL语句来打补丁(只更新部分字段)。

在您的 Batis mapper XML 中,您是否需要定义 2 个函数:

更新用户, 补丁用户,

你在 batis 映射器中定义的是你的 DAO 语句。

您定义的 Spring MVC 就是您的 Controller/Services,以及您想要实现的目标。

如果你想要 2 个端点(PUT、PATCH),并且你希望它们做不同的事情,那么你需要在 batis 中有 2 个不同的语句。

记下 <mapper namespace="org.com.BatisUserService">,稍后您将使用它来引用其他 类 的实现,例如 @Controller,或 @Service Spring MVC 应用程序。

<?xml version="1.0" encoding="UTF-8" ?>    
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.com.BatisUserService">  <---- Take note of this
    <update id="updateUser"
        parameterType="org.com.model.User">
        UPDATE user SET
        user_name=#{userName,jdbcType=VARCHAR},
        user_password=#{userPassword,jdbcType=VARCHAR},
        user_email=#{userEmail,jdbcType=VARCHAR}
        WHERE
        user_id=#{userId,jdbcType=INTEGER};
    </update>

    <update id="patchUser"
        parameterType="org.com.model.User">
        UPDATE user SET
        user_name=#{userName,jdbcType=VARCHAR}
        user_password=#{userPassword,jdbcType=VARCHAR},
        WHERE
        user_id=#{userId,jdbcType=INTEGER};
    </update>
</mapper>

然后在您的 Controller 中,您将调用您的 Mapper org.com.BatisUserService,它定义了函数 updateUserpatchUser

@Controller
@RequestMapping(value = "/user")
public class UserController {

  @Autowired
  private BatisUserService batisUserService;

  @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
  public User updateUser(User user) {
      batisUserService.updateUser(user);
  }

  @RequestMapping(value = "/patchUser", method = RequestMethod.PATCH)
  public User patchUser(User user) {
      batisUserService.patchUser(user);
  }

}