SpringBoot查询方式全解析

文章目录

一、简介

在 HTTP 协议的规范中,请求方法与资源操作有着明确的对应关系:GET 和 POST 是其中用于查询请求的常见方式,而除此之外,POST、DELETE、PUT 还分别对应着资源的新增、删除和修改操作。​

其中,GET 方法的设计初衷是 "只查不改"------ 无论执行多少次,它的作用仅仅是获取服务器上的资源,不会对资源本身产生任何修改。这种特性带来了两大优势:一是可缓存性,浏览器或代理服务器可以缓存 GET 请求的结果,从而提升后续访问的效率;二是可重复执行性,多次发起相同的 GET 请求,得到的结果始终一致,也不会引发意外的副作用。这两点共同决定了 GET 方法不适合用于修改操作。​

而在 Spring Boot 框架中,GET 方法成为了获取资源的首选方式,尤其适用于查询场景、参数可公开、具备幂等性(多次操作结果一致)且需要缓存的业务需求。不过在使用时,需要特别注意两个要点:一是 URL 存在长度限制,过长的参数可能导致请求失败;二是参数的安全性,由于 GET 请求的参数会暴露在 URL 中,因此要避免传递敏感数据,更不能用它来执行修改服务器状态的操作。

二、常用注解分类

1、请求映射类(处理 URL 与 HTTP 方法的绑定)

核心是将 HTTP 请求映射到控制器方法,通过 "路径 + HTTP 方法" 定位接口。

  • 基础注解:@RequestMapping(最底层,可指定路径、请求方法、参数等)。
  • 衍生注解:@GetMapping(限定 GET 方法)、@PostMapping(POST)、@PutMapping(PUT)、@DeleteMapping(DELETE)、@PatchMapping(PATCH)。

其中衍生注解是@RequestMapping的简化版,如@GetMapping = @RequestMapping(method = RequestMethod.GET))

2、参数绑定类(从请求中获取数据并绑定到方法参数)

核心是从 HTTP 请求的不同位置(路径、查询参数、请求体等)提取数据,绑定到控制器方法的参数上。

  • 路径参数:@PathVariable(获取 URL 路径中的占位符,如/users/{id}中的id)。
  • 查询参数:@RequestParam(获取 URL 中?key=value形式的参数)。
  • 请求体:@RequestBody(获取 HTTP 请求体中的数据,通常是 JSON/XML,用于 POST/PUT 等)。
  • 请求头 / Cookie:@RequestHeader(获取请求头信息,如User-Agent)、@CookieValue(获取 Cookie 值)。
  • 特殊参数:@MatrixVariable(获取 URL 中;分隔的矩阵变量,如/books;author=鲁迅)、@RequestPart(获取multipart/form-data类型的数据,如文件上传)。
  • 域对象:@RequestAttribute(获取请求域request中的属性)、@SessionAttribute(获取会话域session中的属性)。
    共性:都用于 "从请求中拿数据",区别仅在于数据在请求中的位置(路径、查询串、请求体等)。

3、控制器与增强类(标识控制器及全局增强)

核心是标识控制器类,或对控制器进行全局增强(如异常处理、数据预处理)。

  • 基础控制器:@RestController(= @Controller + @ResponseBody,标识 REST 接口控制器,返回值直接作为响应体)。
  • 全局增强:@ControllerAdvice(全局控制器增强,用于集中处理异常、全局数据绑定等)、@RestControllerAdvice(= @ControllerAdvice + @ResponseBody,增强 REST 接口,异常处理返回 JSON)。

4、异常与响应处理类(处理接口异常和响应状态)

核心是控制接口的异常处理和 HTTP 响应状态。

  • 异常处理:@ExceptionHandler(处理控制器方法抛出的异常,结合@ControllerAdvice实现全局异常处理)。
  • 响应状态:@ResponseStatus(指定接口或异常处理返回的 HTTP 状态码,如 404、500)。

5、数据模型与会话类(处理模型数据和会话存储)

核心是管理请求 / 会话中的数据,或绑定模型数据。

  • 模型数据:@ModelAttribute(向模型中添加数据,或绑定请求参数到模型对象)。
  • 会话存储:@SessionAttributes(指定模型中的哪些属性存入会话域,作用于类)、@SessionAttribute(从会话域中获取属性,作用于参数)。

6、其他辅助类

  • 跨域处理:@CrossOrigin(解决跨域请求问题,指定允许的来源、方法等)。
  • 数据绑定初始化:@InitBinder(自定义请求参数的绑定规则,如日期格式化、类型转换)。
  • 基础父注解:@Mapping(所有请求映射注解的父注解,定义路径映射的基本属性)。

三、查询方式写法

1、路径变量

路径:/forlan/entity/query/{param1}

单个参数写法

java 复制代码
@GetMapping("/forlan/entity/query/{param1}")
public Result<List<ForlanVO>> queryList(@PathVariable("param1") Long param1)

@GetMapping ("/forlan/entity/query/{param1}")
public Result<List<ForlanVO>> queryList(Long param1)

多个参数,必须加上@PathVariable

java 复制代码
@GetMapping ("/forlan/entity/query/{param1}/{param2}")
public Result<List<ForlanVO>> queryList(
@PathVariable("param1") Long param1,
@PathVariable("param2") Long param2
)

2、查询变量

路径:/forlan/entity/filter?param1=xxx&param2=yyy

java 复制代码
@GetMapping("/forlan/entity/filter")
public Result<List<ForlanVO>> filterList(Long param1, Long param2)

基础类型参数可省略 @RequestParam,如需配置默认值或必填项则需添加

java 复制代码
@GetMapping ("/forlan/entity/filter")
public Result<List<ForlanVO>> filterList(
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam List<Long> ids
)

注意:集合类型参数必须添加 @RequestParam,否则会出现异常:No primary or default constructor found for interface java.util.List

原因:Spring MVC 尝试实例化接口类型(List)时无法找到合适的构造器,需通过 @RequestParam 明确指定参数绑定方式

3、实体类参数

默认接收 form-data 格式参数

java 复制代码
@PostMapping("/forlan/entity/search")
public Result<List<ForlanVO>> searchList (ForlanDTO dto)

如需接收 JSON 格式参数,需添加 @RequestBody

java 复制代码
@PostMapping ("/forlan/entity/search")
public Result<List<ForlanVO>> searchList(@RequestBody ForlanDTO dto)

四、其它Springboot扩展参数

@JsonAlias("xxx"):为字段提供一个或多个反序列化时的别名,适合兼容旧字段名或不同命名风格

示例:前端传forlan或Forlan都能接收到参数

java 复制代码
@JsonAlias("forlan")
private String Forlan;

@JsonProperty("xxx"):定义序列化/反序列化时使用的主属性名

序列化:Java 对象 → JSON 响应/文件

反序列化:JSON 请求/文件 → Java 对象

相关推荐
uzong1 小时前
认知破局:在信息茧房时代重构后端工程师的思维思维
后端
Lisonseekpan1 小时前
MVCC的底层实现原理是什么?
java·数据库·后端·mysql
灰原喜欢柯南2 小时前
实战:MyBatis 中 db.properties 的正确配置与最佳实践
java·数据库·mybatis
中东大鹅2 小时前
SpringBoot实现文件上传
java·spring boot·后端
牛马程序员‍3 小时前
Day116 若依融合mqtt
java·mqtt·若依·mqttx
David爱编程3 小时前
Java中main 方法为何必须是static?
java·后端
追梦人物3 小时前
Uniswap 手续费和协议费机制剖析
前端·后端·区块链
小沈同学呀3 小时前
阿里巴巴高级Java工程师面试算法真题解析:LRU Cache实现
java·算法·面试
我今晚不熬夜4 小时前
使用单调栈解决力扣第42题--接雨水
java·数据结构·算法·leetcode