前后端传参时不同情况对应的注解

本文深入探讨了Spring MVC框架中三种关键注解的使用方法:@PathVariable用于路径变量,@RequestParam用于请求参数,而@RequestBody则用于接收JSON或XML请求体。通过具体的代码示例,详细解析了每个注解的功能及其在前后端交互中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.@PathVariable用法

    @GetMapping("spu/updatesaleable/{id}")//注意此处注解加上参数
    public ResponseEntity<Void> updatezhuangtai(@PathVariable("id")Long id){//此处注解也需要加上参数
        this.goodsService.updatesaleable(id);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

所对应的前端

			updatesaleable(id){
				this.$message.confirm("确认要改变状态吗?")
				.then(() => {
				  this.$http.get("/item/spu/updatesaleable/" + id)//注意传参方法为("/**/**/"+参数)
				      .then(() => {
				          this.$message.success("修改成功");
				          this.getDataFromServer();
				      })
				})
				}

2.@RequestParam用法
@RequestParam注解主要有哪些参数:
value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值

    @GetMapping("page")//此处注解无参数
    public ResponseEntity<PageResult<Brand>> queryBrandsByPage(
            @RequestParam(value = "key", required = false)String key,         
            @RequestParam(value = "page", defaultValue = "1")Integer page,
            @RequestParam(value = "rows", defaultValue = "5")Integer rows,
            @RequestParam(value = "sortBy", required = false)String sortBy,
            @RequestParam(value = "desc", required = false)Boolean desc
    ){

        PageResult<Brand> pageResult = this.brandService.queryBrandsByPage(key, page, rows, sortBy, desc);

        if (CollectionUtils.isEmpty(pageResult.getItems())){

            return ResponseEntity.notFound().build();
        }

        return ResponseEntity.ok(pageResult);
    }

所对应的前端

      getDataFromServer() { // 从服务的加载数的方法。
        // 发起请求
        this.$http.get("/item/brand/page", {
          params: {
            key: this.search, // 搜索条件
            page: this.pagination.page,// 当前页
            rows: this.pagination.rowsPerPage,// 每页大小
            sortBy: this.pagination.sortBy,// 排序字段
            desc: this.pagination.descending// 是否降序
          }
        }).then(({data}) => { // 这里使用箭头函数
					
          this.brands = data.items;
          this.totalBrands = data.total;
          // 完成赋值后,把加载状态赋值为false
          this.loading = false;
        })
      }
    @PostMapping//此处无参数
    public ResponseEntity<Void> saveBrand(Brand brand, @RequestParam("cids")List<Long> cids){ //此处有(”参数“)

        this.brandService.saveBrand(brand,cids);

        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

对应前端

      addBrand() {
        // 修改标记
        this.isEdit = false;
        // 控制弹窗可见:
        this.show = true;
        // 把oldBrand变为null
        this.oldBrand = null;
      }

3.@RequestBody用法

@PostMapping("add")//此处无参数
    public void toAdd(@RequestBody Map<String,Map<String,Category>> map){  //不写(”参数“)

        Map<String,Category> params=map.get("params");

        Category node = params.get("node");

        this.categoryService.add(node);

    }

对应后端

methods: {
      handleAdd(node) {
				
				this.$http.post("/item/category/add",{
					params:{
						node:node
					}
				})
				
        console.log("add .... ");
        console.log(node);
      }
<think>好的,我现在需要回答用户关于MyBatis中前后端通过Controller传参的示例教程的问题。首先,我得回忆一下用户提供的引用内容,看看有哪些相关的信息可以利用。 用户提到了四个引用,其中引用[1]展示了调用存储过程的Controller层代码,使用@RequestParam来接收参数。引用[3]讨论了Get请求传参,包括路径参数QueryWrapper的使用。引用[4]详细说明了Controller层如何接收前端参数,并在Service层处理数据,涉及到DTO实体类的转换。这些引用应该能帮助构建回答。 接下来,我需要确定用户的主要需求:他们想了解MyBatis中前后端传参的方法最佳实践,特别是Controller层的示例。所以,我应该覆盖常见的传参方式,比如GETPOST请求的参数接收,路径参数,以及如何处理复杂对象。 首先,GET请求的参数通常使用@RequestParam或者@PathVariable。引用[3]中的例子展示了使用@PathVariable获取路径参数,并在Service层使用QueryWrapper构建查询条件。这可以作为路径参数的示例。 然后,POST请求通常会传递JSON数据,这候需要在Controller中使用@RequestBody来接收,如引用[4]中提到的DTO对象。这里需要强调DTO的作用,用于数据传输与实体类的转换,避免直接暴露实体类结构。 另外,用户可能对参数校验感兴趣,比如使用@Valid注解进行验证,确保数据的合法性。同,参数绑定到对象也是一种常见做法,比如使用对象接收多个参数,而是逐个声明。 还需要提到MyBatis-Plus中的Wrapper用法,如引用[3]中的QueryWrapper,展示如何在Service层处理参数并构建查询条件。这部分可以说明参数如何传递到持久层。 最后,总结最佳实践,比如使用DTO分层、参数校验、选择适当的传参方式等。同,根据用户提供的引用,正确添引用标记,比如在提到DTO转换引用[4],在路径参数示例中引用[3],存储过程调用引用[1]。 需要确保回答结构清晰,分点说明不同传参方式,并提供代码示例。还要注意使用中文,LaTeX格式的行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,但如果有变量或表达式的话需要注意格式。 检查是否有遗漏的部分,比如是否有其他传参方式需要覆盖,或者是否需要更多的最佳实践建议。确保每个示例都来自用户提供的引用,并正确标注来源。 现在整理这些思路,组织成一个结构化的回答,涵盖不同传参方式、代码示例、参数校验最佳实践,并合理引用提供的资料。</think>### MyBatis前后端Controller传参方法及示例 在MyBatis中,前后端通过Controller传参的常见方式包括**路径参数**、**查询参数**、**请求体参数****对象绑定**。以下结合代码示例最佳实践详细说明。 --- #### 一、GET请求传参 ##### 1. 路径参数 通过URL路径传递参数,使用`@PathVariable`注解接收。 **示例:** ```java // Controller层 @GetMapping("/user/{id}") public User getUserById(@PathVariable("id") Long id) { return userService.getUserById(id); } // Service层(结合MyBatis-Plus的QueryWrapper) public User getUserById(Long id) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); return userMapper.selectOne(queryWrapper); } ``` 此方式适用于**资源标识**场景,如根据ID查询用户[^3]。 ##### 2. 查询参数 通过URL的`?key=value`形式传递,使用`@RequestParam`接收。 **示例:** ```java @GetMapping("/users") public List<User> getUsersByRole(@RequestParam String role) { return userService.getUsersByRole(role); } ``` 若参数较多,建议改用**对象绑定**(见下文)[^3]。 --- #### 二、POST/PUT请求传参 ##### 1. 表单参数 接收表单提交的键值对数据,使用`@RequestParam`或对象绑定。 **示例:** ```java @PostMapping("/create") public BaseResponse<?> createUser(@RequestParam String name, @RequestParam Integer age) { userService.createUser(name, age); return new BaseResponse<>(); } ``` ##### 2. JSON请求体参数 接收JSON格式的复杂对象,使用`@RequestBody`注解。 **示例:** ```java // 定义DTO public class UserDTO { private String name; private Integer age; // getter/setter } // Controller层 @PostMapping("/create") public BaseResponse<?> createUser(@RequestBody @Valid UserDTO userDTO) { userService.createUser(userDTO); return new BaseResponse<>(); } // Service层(DTO转实体) public void createUser(UserDTO userDTO) { User user = new User(); BeanUtils.copyProperties(userDTO, user); userMapper.insert(user); } ``` **关键点:** - 使用`@Valid`进行参数校验(如JSR 303标准注解)[^4]。 - 通过DTO隔离前端请求与数据库实体,增强安全性[^4]。 --- #### 三、复杂参数场景 ##### 1. 多表关联操作 当涉及多表操作,DTO可包含嵌套对象或集合。 **示例(添套餐菜品):** ```java // DTO定义 public class SetmealDTO { private Setmeal setmeal; private List<SetmealDish> dishes; } // Service层实现 public void addSetmeal(SetmealDTO setmealDTO) { // 插入套餐表 setmealMapper.insert(setmealDTO.getSetmeal()); // 获取自动生成的ID Long setId = setmealDTO.getSetmeal().getId(); // 绑定菜品与套餐关系 setmealDTO.getDishes().forEach(dish -> dish.setSetmealId(setId)); setmealDishMapper.insertBatch(setmealDTO.getDishes()); } ``` 此方式适用于**一对多**关系的数据插入[^4]。 ##### 2. 存储过程调用 通过XML映射文件调用存储过程。 **示例:** ```xml <!-- Mapper XML --> <select id="callProcedure" statementType="CALLABLE"> {call update_user_status(#{oldNo,mode=IN}, #{id,mode=IN}, #{versionFlag,mode=IN})} </select> ``` Controller层通过`@RequestParam`接收参数并调用[^1]。 --- #### 四、最佳实践 1. **分层清晰** - Controller仅负责参数接收与响应。 - Service处理业务逻辑,避免直接操作数据库[^4]。 2. **参数校验** 使用`@Valid`结合`@NotNull`、`@Size`等注解确保数据合法性。 3. **灵活选择传参方式** - 简单查询:`@RequestParam`或路径参数。 - 复杂数据:`@RequestBody` + DTO。 4. **MyBatis-Plus的Wrapper使用** 动态构建查询条件,避免SQL拼接: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张").or().eq("status", 1); userMapper.selectList(wrapper); ``` 此方式提升代码可读性维护性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值