看了我的文章,保你对@ResponseBody @RequestBody @RequestParam @PathVariable @PathParam() 和@Param()注解没有不懂得

      哎呀,这一转眼都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代码如下:

扫描二维码关注公众号,回复: 12413781 查看本文章
<select id="findRoleByMix" resultType="role">
    SELECT id,name FROM t_role
    WHERE roleName=#{roleP.roleName}
    AND note=#{rolep.note}
<select>

好了,今天就和大家分享到这,大家有那些疑问或者是讲的不对的地方,欢迎大家在下方评论留言。
2021新年快乐呀,希望疫情赶快过去

猜你喜欢

转载自blog.csdn.net/weixin_45150104/article/details/112332487