当前位置: 首页 > news >正文

SpringBoot查询方式全解析

文章目录

  • 一、简介
  • 二、常用注解分类
    • 1、请求映射类(处理 URL 与 HTTP 方法的绑定)
    • 2、参数绑定类(从请求中获取数据并绑定到方法参数)
    • 3、控制器与增强类(标识控制器及全局增强)
    • 4、异常与响应处理类(处理接口异常和响应状态)
    • 5、数据模型与会话类(处理模型数据和会话存储)
    • 6、其他辅助类
  • 三、查询方式写法
    • 1、路径变量
    • 2、查询变量
    • 3、实体类参数
  • 四、其它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}

单个参数写法

@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

@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

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

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

@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 格式参数

@PostMapping("/forlan/entity/search")
public Result<List<ForlanVO>> searchList (ForlanDTO dto)

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

@PostMapping ("/forlan/entity/search")
public Result<List<ForlanVO>> searchList(@RequestBody ForlanDTO dto)

四、其它Springboot扩展参数

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

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

@JsonAlias("forlan")
private String Forlan;

@JsonProperty(“xxx”):定义序列化/反序列化时使用的主属性名
序列化:Java 对象 → JSON 响应/文件
反序列化:JSON 请求/文件 → Java 对象

http://www.dtcms.com/a/324866.html

相关文章:

  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • 数字图像处理2——图像增强
  • AI(1)-神经网络(正向传播与反向传播)
  • 【RL第七篇】PPO训练策略,如何使PPO训练稳定?
  • unity中如何让原人物动画兼容新人物的动画
  • 异步问题的概念和消除问题技巧
  • Graph-R1:一种用于结构化多轮推理的智能图谱检索框架,并结合端到端强化学习
  • 【面板数据】全国及各省份技术市场成交额数据-dta+xlsx格式(2001-2023年)
  • nginx+lua+redis案例
  • 《Webpack与Vite热模块替换机制深度剖析与策略抉择》
  • 消息生态系统全景解析:技术架构、核心组件与应用场景
  • 【Python练习】085. 编写一个函数,实现简单的DNS服务器功能
  • LeeCode 46. 全排列
  • 【树\思维】P1395 会议
  • 33.搜索旋转排序数组
  • Agno智能体框架简单使用
  • docker等基础工具使用
  • 从策略梯度到 PPO
  • java中的继承
  • Flutter开发 LinearProgressIndicato、CircularProgressIndicator
  • django基于Python的设计师作品平台的数据可视化系统设计与实现
  • QT的常用控件说明
  • Java基础—解析注解
  • 游戏常用运行库合集:一键解决游戏兼容性问题
  • 锂电池SOH预测 | 第35讲 Matlab基于BiLSTM的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集
  • scanpy单细胞转录组python教程(二):单样本数据分析之数据质控
  • springboot的基础要点
  • 【Task3】【Datawhale AI夏令营】多模态RAG
  • 3.4路由守卫
  • Words or Vision Do Vision-Language Models Have Blind Faith in Text