发表于: 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天半的时间

②问题通常是多解的,我们要做的是尽可能做出多个解,然后根据具体场景分析优劣,最后综合得出最优解。(当然是在时间允许的前提下


返回列表 返回列表
评论

    分享到