Day4
目录
3.3@ReuqestParm与@ModelAttribute的区别
作者是跟黑马课程学的
前言
今天是独自完成有关于菜品套餐的接口
1.完成任务报告
1.完成顺序,老师要求:
-
新增套餐
-
套餐分页查询
-
删除套餐
-
修改套餐
-
起售停售套餐
2.补充之前菜品未完成接口(老师忽略的)
2.任务中的收获
1.新增套餐接口:由于是添加一个套餐,那么套餐是不是包含了菜品的选择,所以我们要考虑添加套餐时进行菜品的回显,让管理员选择菜品,当套餐的信息要保存时,后端也应将前端的数据进行分模块的纪录在数据库中,并且添加完套餐后,默认套餐是停售状态
重点:我们每次完成一个接口时要考虑是否需要后端数据回显,考虑是否需要分模块的存入数据库
2.套餐分页查询接口:这个没有特别注意的,主要是会使用PageHelper这个插件,具体功能之前有说过了
3.删除套餐接口:由于这是一个外卖平台,那么正在启售的套餐是不能删除的(用户在选套餐,突然套餐没了,这不行吧),所以我们需要判断选择的套餐的售卖状态(正在售卖的不能删除,停止售卖的可以删除)
重点:实现删除接口时,我们需要考虑什么时候是可以删除的,我们可以直接写个批量删除的接口就可以了(删除单个也包含在内)
4.修改套餐接口:管理员修改套餐,点击修改,套餐数据是不是需要展示出来(数据回显),而当管理员修改完数据,后端接收到数据时,我们需要做个判断,管理员修改的数据我就修改,没有修改的,那我就保持原来的数据(SQL语句中用<if>来实现)
重点:实现修改接口,肯定要数据回显的,并且判断哪些是要修改的数据
5.起售停售套餐接口:当我要起售一个套餐时,套餐里包含菜品,那么我们需要考虑套餐里面的菜品是否是可以售卖状态,如果包含不可售卖的菜品,那么套餐就不能起售(停售不需要)
重点:当你要改变一个东西的状态,那么我们需要考虑它所关联的数据,是否允许改变
6.总体收获:
1.我在完成接口时每次出的错都是在SQL语句书写错误,比如:没有逗号
2.看接口文档的细节:老师给的接口文档上标明该参数会传给后端(其实是空),那么这时候你就需要考虑哪些是展示给用户看的,用户看的数据,返回给后端就一定是有数据的,那些没有的你就需要给它设置数据(重点:考虑哪些数据需要你自己来赋值的)
3.涉及多个SQL语句的执行时,记得加上事务管理(@Transactional)
4.如:批量删除,那我们应该在SQL语句中进行循环的删除,不要在业务层来进行循环来调用SQL(效率不高) =》(重点:如果要循环调用SQL语句,在SQL语句上写循环,不要在业务层循环调用)(尽量减少多次查询数据库)
3.知识点扩展
3.1为什么@ReuqestParm可以省略
1.之前我说过,@ReuqestParm这个注解是用来接收前端地址栏传参时所使用的注解,当前端与后端参数名称相同时可以省略
2.为什么呢?
1.首先后端如果用基本类型,数组,集合来接收前端的数据,Spring会默认使用@ReuqestParm这个注解
2.而前后端参数名称相同,省略@ReuqestParm,那么Spring就会自动按@ReuqestParm来实现(类似自动装配,它会帮你自动一一对应上)
3.如果前后端多个参数名称也对应相同,也可以省略@ReuqestParm,Spring会自动根据名称来接收
4.参数名称不同,那么你就需要指定对应名称,让Sping能够来对应接收数据
5.前端传过来是一个数组,你选择String类型接收,@ReuqestParm可以忽略,选择集合,数组来接收,那么你需要声名@ReuqestParm,Spring先知道前端传过来数组,然后你加上了@ReuqestParm,那么Spring会自动拿出前端数组里面的元素,装入后端的集合或者数组中(当然参数不同,你还需要指定参数)
6.接上面,如果我不写这个注解@ReuqestParm呢,那么Spring会默认前端传过来的是一个整体参数,不会进行拆分,那么你数组或者集合的第一个元素装的就是它
3.总结:明确后端接收数据的参数类型(基本类型,字符串,数组,集合),Spring就会默认@ReuqestParm,前后端参数名称不同,就在注解中指定名称
3.2为什么@ModelAttribute可以省略
1.我一开始都不知道这个注解,这是我写代码时报错时询问Ai时才知道它
2.如果前端传过来很多参数,后端是不是可以用一个自定义实体类来接收,老师说可以省略注解,我之前一直以为就是@ReuqestParm,好吧,其实是@ModelAttribute
3.@ModelAttribute的作用:
1.如果你后端用来接收前端的参数是一个对象,自定义实体类(这种封装类),那么Spring识别到这个参数类型,就会自动默认@ModelAttribute来实现功能
2.而@ModelAttribute的功能就是将前端传过来的参数一一对应进后端封装的实体类中(就说实体类的属性名称与前端参数名称相同,就可以一一对应赋值)
4.为什么可以省略:
1.其实原理和@ReuqestParm差不多,因为Spring会识别,当你后端接收参数是自定义类型(这样的类型都可以),Spring就会默认@ModelAttribute来实现,所以你可以省略
2.类似功能可以根据上面@ReuqestParm说明来推出
3.3@ReuqestParm与@ModelAttribute的区别
1.@ReuqestParm要参数名称对应才能省略,而@ModelAttribute实际上是进行实体类封装,不需要参数名称对应也能省略(实体类中的属性名称要与前端参数名称对应)
2.Spring默认识别不同:当基本类型,字符串,数组,集合时(@ReuqestParm),自定义实体类时(@ModelAttribute)
3.@ModelAttribute一般都不用特意写出来,而@ReuqestParm就需要自己判断