如何实现http补丁逻辑



我使用的是java、springmvc和mybatis。

对于httppatch,它用于更新部分资源,而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>

那么如何在springmvc中实现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

并且他们使用相同的mybatisupdate语句?

那么,如何在代码中实现putpatch呢?或者它们的区别只是在语义上,而不是在代码上?

让我们先澄清一些事情:

  • 更新:如果Bean(MyBean)有多个字段,那么您可以创建一条SQL语句来更新bati中的所有字段。

  • Patch:如果Bean(MyBean)有多个字段,则创建1个SQL语句进行修补(仅更新某些字段(。

Batis mapper XML中,是否需要定义两个函数:

更新用户, 补丁用户,TR

您在batis映射程序中定义的是DAO语句。

您定义Spring MVC的是您的控制器/服务,以及您想要实现的目标。

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

注意<mapper namespace="org.com.BatisUserService">,稍后您将使用它来引用其他类的实现,如SpringMVC应用程序中的@Controller@Service

<?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>

然后在控制器中,您将调用映射器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);
}
}

最新更新