news 2026/5/4 12:46:57

Java API接口从0到1实战:新手也能看懂的编写指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java API接口从0到1实战:新手也能看懂的编写指南

Java API 接口从 0 到 1 实战指南
(2025–2026 年最常用、最务实写法,新手友好版)

目标:
用最短路径,让一个刚学完 JavaSE 的同学能在3–5 天内独立写出生产级 RESTful API(包含增删改查、分页、参数校验、统一响应、异常处理、日志、接口文档)。

技术选型推荐(2026 年新项目主流组合)

技术项推荐选择(新手友好)为什么选它(2026 年视角)替代选项(可选了解)
框架Spring Boot 3.3.x / 3.4.x自动配置最彻底、生态最全Spring MVC 纯手工
Web 层@RestController + Spring Web最简单、最常用WebFlux(高并发场景)
JSON 处理Jackson(Spring Boot 默认)性能好、兼容性强Fastjson(慎用)
参数校验jakarta.validation + @Valid标准、注解式、易读
统一响应自定义 R / Result公司规范 90% 都这么做ResponseEntity
异常处理@ControllerAdvice + @ExceptionHandler全局统一、优雅
日志lombok + slf4j + logback最轻、最常用log4j2
接口文档springdoc-openapi 2.x(OpenAPI 3)免费、美观、替代 swagger-uiKnife4j(国内更流行)
构建工具Maven(最稳)面试/公司项目主流Gradle(越来越多人用)
数据库访问(可选)MyBatis-Plus 3.5.x代码少、功能强、分页方便Spring Data JPA

完整项目结构(推荐)

demo-api ├── src │ ├── main │ │ ├── java │ │ │ └── com/example/demo │ │ │ ├── common # 统一响应、异常、常量 │ │ │ ├── config # 配置类(可选) │ │ │ ├── controller │ │ │ ├── entity # 实体类 │ │ │ ├── mapper # MyBatis Mapper(可选) │ │ │ ├── service │ │ │ └── vo # 入参/出参 DTO │ │ └── resources │ │ ├── application.yml │ │ └── logback-spring.xml(可选) │ └── test └── pom.xml

步骤 1:快速创建项目(5 分钟)

方式一(最推荐):

  1. 打开 https://start.spring.io/

  2. 配置:

  3. Generate → 解压 → IDEA 打开

步骤 2:核心代码清单(复制粘贴就能跑)

1. 统一响应类(common/R.java)
packagecom.example.demo.common;importlombok.Data;@DatapublicclassR<T>{privateintcode;privateStringmsg;privateTdata;publicstatic<T>R<T>ok(){returnok(null);}publicstatic<T>R<T>ok(Tdata){R<T>r=newR<>();r.setCode(200);r.setMsg("success");r.setData(data);returnr;}publicstatic<T>R<T>error(intcode,Stringmsg){R<T>r=newR<>();r.setCode(code);r.setMsg(msg);returnr;}publicstatic<T>R<T>error(Stringmsg){returnerror(500,msg);}}
2. 全局异常处理(common/GlobalExceptionHandler.java)
packagecom.example.demo.common;importjakarta.validation.ConstraintViolationException;importorg.springframework.http.HttpStatus;importorg.springframework.validation.BindException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvicepublicclassGlobalExceptionHandler{// 参数校验异常@ExceptionHandler({MethodArgumentNotValidException.class,BindException.class})@ResponseStatus(HttpStatus.BAD_REQUEST)publicR<Void>handleValidException(Exceptione){Stringmsg=e.getMessage();if(einstanceofMethodArgumentNotValidExceptionex){msg=ex.getBindingResult().getFieldError().getDefaultMessage();}elseif(einstanceofBindExceptionex){msg=ex.getAllErrors().get(0).getDefaultMessage();}returnR.error(400,msg);}// 通用异常兜底@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)publicR<Void>handleException(Exceptione){// 实际项目建议把异常信息记录日志returnR.error(500,"服务器内部错误:"+e.getMessage());}}
3. 实体 + DTO 示例(以用户为例)
// entity/User.javapackagecom.example.demo.entity;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importlombok.Data;@DatapublicclassUser{@TableId(type=IdType.AUTO)privateLongid;privateStringusername;privateStringemail;privateIntegerage;}// vo/UserVO.java(出参)@DatapublicclassUserVO{privateLongid;privateStringusername;privateStringemail;privateIntegerage;}// vo/UserQueryVO.java(分页查询入参)@DatapublicclassUserQueryVO{privateIntegerpage=1;privateIntegersize=10;privateStringusername;}
4. Controller(最核心部分)
packagecom.example.demo.controller;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.example.demo.common.R;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importcom.example.demo.vo.UserQueryVO;importcom.example.demo.vo.UserVO;importjakarta.validation.Valid;importorg.springframework.beans.BeanUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;importjava.util.stream.Collectors;@RestController@RequestMapping("/api/v1/users")publicclassUserController{@AutowiredprivateUserServiceuserService;// 新增@PostMappingpublicR<UserVO>create(@RequestBody@ValidUseruser){userService.save(user);UserVOvo=newUserVO();BeanUtils.copyProperties(user,vo);returnR.ok(vo);}// 修改@PutMapping("/{id}")publicR<UserVO>update(@PathVariableLongid,@RequestBody@ValidUseruser){user.setId(id);userService.updateById(user);UserVOvo=newUserVO();BeanUtils.copyProperties(user,vo);returnR.ok(vo);}// 删除@DeleteMapping("/{id}")publicR<Void>delete(@PathVariableLongid){userService.removeById(id);returnR.ok();}// 单个查询@GetMapping("/{id}")publicR<UserVO>getById(@PathVariableLongid){Useruser=userService.getById(id);if(user==null){returnR.error(404,"用户不存在");}UserVOvo=newUserVO();BeanUtils.copyProperties(user,vo);returnR.ok(vo);}// 分页查询(带条件)@GetMappingpublicR<Page<UserVO>>page(@ModelAttributeUserQueryVOquery){Page<User>page=newPage<>(query.getPage(),query.getSize());LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<>();wrapper.like(query.getUsername()!=null,User::getUsername,query.getUsername());wrapper.orderByDesc(User::getId);Page<User>userPage=userService.page(page,wrapper);// 转 VOPage<UserVO>voPage=newPage<>();BeanUtils.copyProperties(userPage,voPage,"records");List<UserVO>records=userPage.getRecords().stream().map(u->{UserVOvo=newUserVO();BeanUtils.copyProperties(u,vo);returnvo;}).collect(Collectors.toList());voPage.setRecords(records);returnR.ok(voPage);}}

5. application.yml(基础配置)

server:port:8080spring:application:name:demo-apidatasource:url:jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case:trueglobal-config:db-config:id-type:auto

最后 10 分钟检查清单(新手最容易忘)

完成以上步骤,你就已经从 0 写出了一个相对规范、可维护、生产可用的 RESTful API 项目

下一阶段推荐(按顺序)

  1. 加登录 + JWT 鉴权(最重要)
  2. 集成 Redis 做缓存
  3. 文件上传(MinIO / 阿里 OSS)
  4. 全局日志 + 请求链路追踪(TraceId)
  5. Docker 打包 + 部署

有哪一步卡住了?把报错信息或想加的功能告诉我,我直接给你最简代码补丁。加油!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 11:03:15

通义千问3-14B硬件选型:4090/4080性价比部署对比

通义千问3-14B硬件选型&#xff1a;4090/4080性价比部署对比 1. 为什么14B模型值得你认真考虑&#xff1f; 很多人看到“14B”第一反应是&#xff1a;小模型&#xff0c;凑合用。但Qwen3-14B彻底打破了这个刻板印象——它不是“将就”&#xff0c;而是“精准卡位”。 它用14…

作者头像 李华
网站建设 2026/4/26 5:31:36

2024文档解析趋势一文详解:MinerU开源模型+GPU加速落地指南

2024文档解析趋势一文详解&#xff1a;MinerU开源模型GPU加速落地指南 PDF文档解析这件事&#xff0c;过去几年一直卡在“能用”和“好用”之间。你可能试过各种工具&#xff1a;有的连多栏排版都识别错位&#xff0c;有的表格一塌糊涂&#xff0c;公式直接变成乱码&#xff0…

作者头像 李华
网站建设 2026/4/30 10:08:28

【大数据毕设源码分享】django基于hadoop的零食销售大数据分析及可视化系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/19 0:18:24

家庭服务器部署Qwen:24小时在线儿童绘画助手搭建教程

家庭服务器部署Qwen&#xff1a;24小时在线儿童绘画助手搭建教程 你是否试过陪孩子画小猫、小熊、小兔子&#xff0c;画到一半他突然问&#xff1a;“妈妈&#xff0c;能画一只穿宇航服的熊猫吗&#xff1f;”——然后你卡在了“宇航服褶皱怎么画”上&#xff1f;别担心&#…

作者头像 李华
网站建设 2026/4/24 13:12:37

MinerU提取速度慢?GPU算力瓶颈分析与优化教程

MinerU提取速度慢&#xff1f;GPU算力瓶颈分析与优化教程 你是不是也遇到过这样的情况&#xff1a;PDF文档刚拖进MinerU&#xff0c;命令敲下去&#xff0c;结果光是“加载模型”就卡住半分钟&#xff0c;等真正开始解析时&#xff0c;一页A4纸要花15秒以上&#xff1f;更别提…

作者头像 李华