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