发表于: 2018-04-25 23:57:36
2 638
今天完成的事情:
1.解决了昨天的一个疑问:如何只更新部分字段
//更新(改)一个女生记录
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age,
@RequestParam("birthday") long birthday){
Girl girl = new Girl();
girl.setId(id);
girl.setCupSize(cupSize);
girl.setAge(age);
girl.setBirthday(birthday);
//疑问:假如一个表有20列,要girl.setXXX()写20个吗?
//一行记录可能只有一两处需要更新,那能不能只输入要的改数据即可。
//而不是每列内容都输入进去?
//增加一个拿出来的过程
return girlRepository.save(girl);
}
各种百度之后找到解决办法:
方法一:使用原生SQL方法实现数据更新
//原生SQL实现更新方法接口
@Query(value = "update Girl set age=?1 where id= ?2", nativeQuery = true)
@Modifying
public void updateOne(int age ,int id);
//在这个方法中调用上面的接口
//单条只更新age列数据
@Transactional
@PostMapping(value = "/girls/one")
public String updateOne(@RequestParam("age") Integer age,
@RequestParam("id") Integer id) {
girlRepository.updateOne(age,id);
return "更新成功";
}
但是,原生语句有一定的弊病,如果语句内部有delete语句,不需要传参数,整个数据库直接删没了,那赶紧跑路吧!
换句话说,使用JPA的目的就是防止SQL注入攻击的。
方法二:先把要改的语句查询出来findById(id).get(),然后更新需要的部分,然后再save()回去。
所要做到的效果,例如:
http://127.0.0.1:8080/girls/1
POST:PUT传参数->age=16
结果:
id=1的age变成16,其余不变。
给出代码:
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
/* @RequestParam("cupSize") String cupSize,*/
@RequestParam("age") Integer age/*,
@RequestParam("birthday") long birthday*/){
Girl girl = girlRepository.findById(id).get();
//girl.setId(id);
//girl.setCupSize(cupSize);
girl.setAge(age);
//girl.setBirthday(birthday);
return girlRepository.save(girl);
}
这个想要改其他列,去掉注释即可。
2.再次回看RESTful
今天看到了一篇很棒的讲解RESTful的知乎文章(虐狗文)
奉上链接:https://zhuanlan.zhihu.com/p/30396391?group_id=937244108725641216
明天的计划:
①继续学习JPA
②理解JPA中的各种概念
③继续敲JPA代码
遇到的问题:
我上面所讲的两种方法是否可行?有没有更好的办法?
收获:
①当时看视频的时候感觉懂了的感觉果然是假的,我看spring-boot的视频前后不到两小时,但是之后的实践敲代码解决报错我用了2天半的时间
②问题通常是多解的,我们要做的是尽可能做出多个解,然后根据具体场景分析优劣,最后综合得出最优解。(当然是在时间允许的前提下)
评论