news 2026/4/23 16:09:55

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/4/23 13:32:28

Z-Image-Turbo适合哪些场景?一文说清楚

Z-Image-Turbo适合哪些场景&#xff1f;一文说清楚 1. 为什么Z-Image-Turbo值得关注&#xff1f; 你有没有遇到过这样的情况&#xff1a;急着出一张电商主图&#xff0c;结果AI生成要等十几秒&#xff1b;想做个带中文标语的海报&#xff0c;生成的文字却是乱码&#xff1b;好…

作者头像 李华
网站建设 2026/4/23 13:33:46

Z-Image-Turbo避坑指南:这些启动细节千万别忽略

Z-Image-Turbo避坑指南&#xff1a;这些启动细节千万别忽略 你兴冲冲下载了Z-Image-Turbo镜像&#xff0c;docker run一气呵成&#xff0c;supervisorctl start z-image-turbo敲得行云流水&#xff0c;浏览器打开127.0.0.1:7860——结果页面空白、加载转圈、控制台报错404&…

作者头像 李华
网站建设 2026/4/23 13:33:05

DFS-字符串分割-数字字符串转化成IP地址

求解代码 ArrayList<String> ans new ArrayList<>();public ArrayList<String> restoreIpAddresses (String s) {if(snull||s.length()<4||s.length()>12){return ans;}StringBuilder sb new StringBuilder();dfs(s,sb,0,0);return ans;}private vo…

作者头像 李华
网站建设 2026/4/23 13:31:30

技术演进中的开发沉思-328 JVM:垃圾回收(上)

在 JVM 的内存管理中&#xff0c;“判定对象是否存活” 是 GC 的核心前提 —— 如果把 GC 比作 JVM 的 “垃圾清洁工”&#xff0c;那可达性分析算法就是 “清洁工的判定标准”&#xff0c;引用类型就是 “给对象贴的不同标签”&#xff1a;有的对象&#xff08;强引用&#xf…

作者头像 李华
网站建设 2026/4/23 13:31:43

YOLOv5主干网络替换实战:基于ShuffleNetV2的轻量化改进与性能优化教程

文末含资料链接和视频讲解! 文章目录 一、轻量化网络技术背景 1.1 移动端部署的挑战 1.2 ShuffleNet系列演进 二、ShuffleNetV2模块深度解析 2.1 通道混洗机制 2.2 Shuffle_Block结构 三、YOLOv5集成ShuffleNetV2全流程 3.1 代码修改实战 步骤1:common.py新增模块 步骤2:yo…

作者头像 李华