如何实现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
语句?
那么,如何在代码中实现put
和patch
呢?
还是它们的区别仅在于语义而不在于代码?
让我们先澄清一些事情:
更新:如果 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
,它定义了函数 updateUser
和 patchUser
:
@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);
}
}
我正在使用 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
语句?
那么,如何在代码中实现put
和patch
呢?
还是它们的区别仅在于语义而不在于代码?
让我们先澄清一些事情:
更新:如果 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
,它定义了函数 updateUser
和 patchUser
:
@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);
}
}