哎呀,这一转眼都2021啦呀,好久没和大家来装装逼探讨探讨技术方面了,今天晚上闲来没事,就跑来和大家深刻探讨下@ResponseBody @RequestBody @PathVariable @PathParam() 和@Param()注解各自功能任务。来喽,老规矩,闲话少说,直奔主题。
1、@ResponseBody注解
@ResponseBody注解的作用:将java对象转化为json格式数据。
@ResponseBody注解的用处:可以用在类上,也可以用在方法上;用在类上代表该类的所有方法返回的结果都会转换为json格式,用在方法上代表该方法的返回结果会转换成json格式。注意:用在controller层时,当@Controller 和 @ResponseBody一起使用时起到的作用和@RestController注解功能一样,当使用thymeleaf时,如过使用@ResponseBody或者@RestController则无法进行返回时跳转相对应页面,会返回JSON格式字符串(注意避开则个坑,我给栽进去了两次)。
2、@RequestBody注解和@RequestParam注解
这两个注解我放在一起相互对照讲,这样能够增加大家的记忆
@RequestBody注解:后端接收前端传递过来的json字符串中的数据;只能在方法的参数前使用且最多只能使用一个。
@RequestParam注解:RequestParam接收的是key-value里面的参数;同样只能在方法的参数中使用,但是它可以在方法参数使用多个,这点和RequestBody注解不一样,它可以用普通参数、集合、数组和对象等。
@RequestBody和@RequestParam可以同时使用,但是RequestBody只能使用一次而RequestParam可以出现多次。RequestBody接收的是请求体里里面的数据,即当前台以json/application传递过来时,那么只能使用@RequestBody接收;如果不是放在请求体里的话,那么就需要使用@RequestParam接收或者形参前什么也不写也能接收。
注意:如果参数前写了@RequestParam(“xxx”),那么在前端传来的必须有xxx名,如果没有,那么请求就会出错,报400.。当然也可以在注解种设置成不一定需要必须有这个参数:@RequestParam(value="param2", required=false) String param2
,这里的reqyired中设置的就是这个功能
当请求为http://localhost:8080/test?name=xiaoZhang
这种时,那么后端接收参数就需要写@RequestParam("name") String name
或者参数前什么也不需要写。
如果是以json字符串传过来的参数,那么就需要使用@RequestBody进行接收。
3、@PathVariable注解和@PathParam()注解
刚开始时我纠结了好大一会,这个是和@RequestParam一起来讲还是单独讲呢,最后还是决定单独来讲吧,然后再进行对照。
@PathVariable和@PathParam()这两个注解同样是只能用于方法的参数前,用于接收请求参数;到这你可能想到刚刚讲的@RequestParam注解,功能和它一样啊,下面我来分析下:
@RequestParam是从请求里面取值,可以是下面这中的
@PostMapping("attrInfoList")
public String getDetails(
@RequestParam(value="catalog3Id", required=true) String catalog3Id){
...
}
它的请求是参数是下面这种的
而 @PathVariable和@PathParam()是从URL模板里面来填充的 ,类似如下这种URL请求格式和模板
@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
请求是是这种
注意:@PathParam这个注解是和spring的pathVariable是一样的,也是基于模板的,但是这个是jboss包下面的一个实现,上面的是spring的一个实现,都要导包。
4、@Param()注解
@Param()注解是org.apache.ibatis.annotations中的,它只能用于方法形参前;作用是给参数命名,命名后,在mapper的xml文件中就能根据名字取到参数值,正确的将参数传入到sql语句中。一般用于2<=参数
mapper接口代码如下:
package com.ygl.gmall.manage.mapper;
import com.ygl.gmall.bean.PmsProductSaleAttr;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ygl
* @description
* @date 2020/12/26 18:17
*/
@Mapper
public interface ProductSaleAttrMapper extends tk.mybatis.mapper.common.Mapper<PmsProductSaleAttr> {
List<PmsProductSaleAttr> selectSpuSaleAttrListCheckBySku(@Param("productId") String productId, @Param("skuId") String skuId);
}
mapper.xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ygl.gmall.manage.mapper.ProductSaleAttrMapper">
<!-- 注意:这里是双重集合,不能再resultType="实体类地址"-->
<select id="selectSpuSaleAttrListCheckBySku" resultMap="selectSpuSaleAttrListCheckBySkuMap">
SELECT
sa.id as sa_id , sav.id as sav_id ,sa.* , sav.* , if(ssav.sku_id,1,0) as isChecked
FROM pms_product_sale_attr sa
INNER JOIN pms_product_sale_attr_value sav on sa.product_id = sav.product_id AND sa.sale_attr_id = sav.sale_attr_id and sa.product_id = #{productId}
LEFT JOIN pms_sku_sale_attr_value ssav on sa.sale_attr_id = ssav.sale_attr_id
and sav.id = ssav.sale_attr_value_id and ssav.sku_id = #{skuId}
</select>
<!--autoMapping="true"代表剩下的属性自主封装,自己搞定-->
<resultMap id="selectSpuSaleAttrListCheckBySkuMap" type="com.ygl.gmall.bean.PmsProductSaleAttr" autoMapping="true">
<result property="id" column="sa_id"></result>
<collection property="spuSaleAttrValueList" ofType="com.ygl.gmall.bean.PmsProductSaleAttrValue" autoMapping="true">
<result column="sav_id" property="id"></result>
</collection>
</resultMap>
</mapper>
当然也适用于参数为对象的,代码如下:
实体类:
public class RoleParam {
private String roleName;
private String note;
/*getter和setter*/
}
mapper接口:
public List<Role> findRoleByMix(@Param("roleP") RoleParam role);
mapper.xml代码如下:
<select id="findRoleByMix" resultType="role">
SELECT id,name FROM t_role
WHERE roleName=#{roleP.roleName}
AND note=#{rolep.note}
<select>
好了,今天就和大家分享到这,大家有那些疑问或者是讲的不对的地方,欢迎大家在下方评论留言。
2021新年快乐呀,希望疫情赶快过去