ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

后端学习day4实战:用Spring Boot+MyBatis+MySQL写完整接口

2026/9/16 4:38:26 拓冰建站 浏览量
后端学习day4实战:用Spring Boot+MyBatis+MySQL写完整接口 后端是一条特别容易让人“学了后面忘了前面”的路我见过太多人从环境搭建开始一路学到框架、数据库、部署结果回头发现自己连一个完整的接口都讲不清楚。day4 这个节点恰好卡在“刚入门想写代码”和“能独立做点东西”之间是最容易迷茫的阶段。这篇笔记不打算讲那些大而全的“后端学习路线”就聚焦第四天到底该学什么、怎么练以及那些网上教程不会细说的关键细节。我默认你至少已经知道了 Java 的基本语法会用 IDEA 或者 VS Code也大概了解 HTTP 是什么东西。如果没有这些基础建议先花三天把 Java 语法、集合、面向对象过一遍再来啃今天的内容。day4 的核心任务只有一个亲手写出一个能接收前端请求、查询数据库、返回结构化数据的后端接口。1. 为什么 day4 是这个学习节点最该动手的时刻1.1 前三天容易陷入的坑大多数自学的人前三天都在做同一件事看教程。今天看变量和数据类型明天看循环和数组后天看类和对象。一天能看完的东西硬是拖了三天然后发现知识点全在脑子里打架。比如String和StringBuilder到底什么时候用ArrayList和LinkedList的底层差异是什么这些东西看着都懂真到写代码的时候完全反应不过来。更麻烦的是很多教程喜欢把知识点拆成一粒一粒的每个知识点一两分钟讲完看完之后你不知道这些粒怎么串成一条线。这就是我反复强调的一件事后端学习不能靠纯看第四天一定要进入项目模式哪怕是三五个接口组成的玩具项目也远比看一整天教程有效。1.2 day4 的目标拆解我建议把 day4 的目标定为“完成一个最小可用的前后端分离 demo 中的后端部分”。什么叫最小可用就是前端页面能通过 HTTP 请求调用你的后端接口后端能对参数做基本校验能读写数据库最终把统一格式的数据返回给前端。拆开来说就是三件事一是把 Spring Boot 项目跑起来写一个能正常访问的 GET 和 POST 接口二是接入 MySQL 数据库用 MyBatis 完成一次查询和插入三是处理好接口返回值格式和跨域问题让前端能顺利调到。这三件事情单看都不难但组合在一起就是一个真实后端项目的全部基础。1.3 选型思路为什么是 Java Spring Boot MySQL很多新手会问后端语言那么多Node.js、Python、Go 都可以为什么后端学习路线里Java 和 Spring Boot 永远是讨论最多的组合我的看法是Java 的生态成熟度和招聘需求量决定了它在国内后端岗位中的主力地位而 Spring Boot 大幅降低了 Spring 框架的使用门槛让新手可以用很少的配置就搭起一个能跑的项目。数据库选 MySQL 则是因为它开源、免费、资料海量遇到任何报错几乎都能搜到现成答案。这不代表其他技术栈不好FastAPI 做轻量级接口非常快Node.js 做前后端同构也很舒服。但如果你现在接触到的业务场景、面试需求和求职方向都指向 Java那就不用纠结语言本身先把这条路的全流程跑通后面再横向扩展就容易得多。2. 从零搭好 Spring Boot 骨架先把开发环境跑通2.1 关于 JDK 与 Maven 的版本匹配很多新手在第一步就被环境问题劝退了其实多半是版本匹配惹的祸。当前稳定常用的组合是 JDK 8 或者 JDK 11 配合 Spring Boot 2.x或者 JDK 17 配合 Spring Boot 3.x。我建议新手直接选 JDK 8 Spring Boot 2.7.x因为网上能搜到的教程、博客、公司存量项目大部分都跑在这个组合上遇到问题更容易找到参考。Maven 的话装 3.6.3 以上版本基本不会出大问题重点是配好阿里云镜像不然第一次拉依赖能慢到你怀疑人生。在settings.xml的mirrors节点里加上阿里云公共仓库的 mirror之后构建速度会有一个质的飞跃。另外要注意IDEA 里配置 Maven 时一定要检查Maven home path、User settings file、Local repository三个地方确保指向你自己安装和解压的目录而不是 IDEA 自带的 Maven。2.2 用 Spring Initializr 快速生成项目不想手动搭目录结构的直接访问 start.spring.io选好构建工具 Maven、语言 Java、Spring Boot 版本然后在依赖里勾选 Spring Web、MyBatis Framework、MySQL Driver、Lombok生成项目后解压导入 IDEA 就行。这里有一个细节国内访问 start.spring.io 有时很慢可以改成阿里的 mirror 地址 start.aliyun.com。也可以直接在 IDEA 里新建 Spring Initializr 项目把 Server URL 换成阿里云的地址。生成完成后建议先看一眼pom.xml里的依赖版本确认 Spring Boot 父工程的版本号再对照本地 JDK 版本确认没有冲突。2.3 第一个接口背后的三个关键动作项目准备就绪后别急着写业务代码先把“跑通接口”这件事做完。第一步是在启动类所在的包下创建一个HelloController写一个只会的 GET 接口返回一串字符串。第二步是运行启动类看到 Spring Boot 的启动日志里出现Tomcat started on port(s): 8080。第三步是打开浏览器访问http://localhost:8080/hello看到你返回的内容。这三个动作没什么难度但很多人会卡在端口被占用和包扫描不到这两个问题上。端口占用很好解决在application.properties里加上server.port8081就能换掉。包扫描问题的典型表现是接口一直 404原因通常是Controller放到了启动类所在包的兄弟目录下Spring Boot 默认只扫描启动类所在包及子包。新手在这里浪费一晚上的情况太常见了先记住这两个排查点。3. 前后端分离项目里的“后端日常”接口、参数、返回值3.1 认识一套合格的接口模板前后端分离这个词你肯定听过很多遍了简单来说就是前端和后端各自独立开发、部署通过 HTTP 接口通信。前端写页面后端写接口两边只需要约定好接口的路径、请求方式、参数名、返回格式就能并行推进。我刚开始学的时候最大的不习惯是后端工程师写接口不能只写自己能调通的代码还要考虑前端调用方的人感受。比如说返回的数据结构如果今天返回{code:0,message:success,data:{}}明天又改成{status:200,msg:ok,result:{}}前端对接的人一定会抓狂。所以接口模板的核心不是你会不会写接口而是你能不能提供一个稳定、一致的契约。3.2 参数接收的三种常见写法具体到 Spring Boot 里接口接收参数常用的有三种方式。第一种是RequestParam用于接收 URL 上的查询参数比如GET /user?id1你在接口方法参数上写RequestParam(id) Integer id就能拿到。第二种是PathVariable用于接收路径参数比如GET /user/1写PathVariable(id) Integer id。第三种是RequestBody用于接收 JSON 格式的请求体前端用POST请求提交一段 JSON 时你在方法参数上写RequestBody User userSpring 会自动帮你把 JSON 映射成 User 对象。这三种写法的选择标准很简单路径参数适合资源定位查询参数适合条件筛选请求体适合提交复杂结构。但要注意用RequestBody接收时必须保证前端传的 JSON 字段名和你的实体类属性名一致不一致时要么前端改要么后端加JsonProperty做映射。实际联调中因为字段名大小写不一致导致数据丢失的现象非常频繁提前约定命名规范很重要。3.3 统一返回结构和异常处理我在 day4 练接口时一口气给前端写了三种返回格式后来被同组的前端兄弟吐槽了整整一个星期。从那以后我学乖了第一件事就是定义统一的返回结构。最常用的格式是{ code: 0, message: success, data: {} }在代码里你可以定义一个泛型类ResultT包含code、message、data三个字段再写几个静态方法比如Result.success(data)、Result.error(code, message)这样无论哪个接口返回时都调用同一个工具类格式就统一了。同时要做全局异常处理用RestControllerAdvice配合ExceptionHandler捕获业务异常、参数校验异常、兜底异常三类避免底层异常堆栈直接裸露给前端。这些动作在 day4 可能体现不出太大优势但等你项目里的接口列表超过十个就会发现统一的返回结构和异常处理是减少沟通成本最划算的投资。4. 数据库连接后端开发绕不开的数据库基础4.1 配置数据源与 MyBatis先明确一件事后端接口如果只是把写死的结果返回给前端那它基本没有什么实际价值。真实业务里数据都存在数据库里接口的常见工作就是“接收参数 - 查询数据 - 组织返回”。所以 day4 的另一个重头戏是打通数据库连接。4.1.1 本地准备 MySQL选对 Workbench 与命令行新手可以先在本地装一个 MySQL 8.x安装时记住 root 密码。我会顺手装一个 MySQL Workbench用来直观地看表结构和执行 SQL。命令行工具也要会基本使用因为我遇到过 Workbench 打不开但命令行能正常连接的情况多一种工具就多一条退路。安装完成后执行mysql -u root -p登录然后创建一个测试库CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;这里强烈建议把字符集指定成utf8mb4否则后续存储 emoji 表情或生僻字时会出现乱码问题。我早期就踩过utf8的坑存中文没问题一存特殊符号直接变乱码最后排查出来是建库时没指定字符集。4.1.2 Spring Boot 连数据库配置文件这样写在application.properties或者application.yml看你项目模板里配置数据源spring.datasource.urljdbc:mysql://localhost:3306/demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password你的密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver几个值得注意的地方serverTimezone不配置的话高版本 MySQL 驱动会报时区错误useSSLfalse方便本机调试生产环境再按需开启driver-class-name在 MySQL 8.x 里必须写com.mysql.cj.jdbc.Driver网上很多老教程写的com.mysql.jdbc.Driver直接复制会报错。MyBatis 还需要配置 mapper.xml 文件的扫描路径比如mybatis.mapper-locationsclasspath:mapper/*.xml mybatis.type-aliases-packagecom.example.demo.entity这样 MyBatis 启动时才能找到对应的 SQL 映射文件。4.2 从增删改查出发理解 CRUD 之外的价值很多人会吐槽“后端只会写增删改查”但结合我这几年做项目的体会增删改查本身并不是没有价值的价值在于你如何理解这一层数据操作在整个系统中的位置。你写一个查询接口简单表可能一条 SQL 就结束了但真实业务里会遇到联表查询、分页、缓存、幂等校验、事务控制。day4 我不建议直接上太复杂的设计先写一个用户表把单表的增删改查跑通就足够了。但在练习过程中要刻意追问自己几个问题插入一条数据后怎么拿到自增主键更新数据时怎么避免把空字段覆盖成空字符串查询列表时如何分页这些问题的答案会在后面每一个真实项目中反复用到。4.3 用 MyBatis 写第一个查询接口先建一张测试表CREATE TABLE user_info ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, email varchar(100) DEFAULT NULL, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;然后创建一个实体类UserInfo字段和表字段对应。创建一个UserInfoMapper接口里面写public interface UserInfoMapper { UserInfo findById(Param(id) Long id); }在resources/mapper/UserInfoMapper.xml里写对应的 SQLselect idfindById resultTypecom.example.demo.entity.UserInfo SELECT * FROM user_info WHERE id #{id} /select接下来在 Service 层调用 MapperController 层暴露接口。整个过程不复杂但环节比较多新手最容易搞混的地方是Mapper 接口的方法名要和 XML 里的 id 对应同时resultType要写全限定类名不然启动时就会出现Invalid bound statement的报错。5. 前后端联调时最容易踩的坑跨域与 Token5.1 跨域是什么以及本地怎么处理前后端分离项目必然遇到跨域问题。前端在http://localhost:5173后端在http://localhost:8080端口不同浏览器就会拦截跨域请求报一个 CORS 错误。解决办法最常见的是后端开启跨域。在 Spring Boot 里可以写一个配置类实现WebMvcConfigurer重写addCorsMappings方法Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }开发阶段这样配没问题但生产环境一定要把allowedOriginPatterns换成真实的前端域名而不是*。这段配置让我少走了很多弯路之前前后端联调时常常是后端说给自己调用没问题前端说用 Postman 调用没问题结果两个服务跨域一调就报错根源就是开发阶段没提前开跨域。5.2 Token 校验的思路跨域处理完接着要面对的就是认证问题。现在主流的前后端分离项目大多用 Token 方式做用户认证流程大致是用户登录成功后端签发一个 Token 返回给前端前端把 Token 存起来之后每次请求都在请求头带上Authorization: Bearer token后端用一个拦截器或者 Spring Security 配置去校验 Token。day4 我先不会让你去集成 Spring Security那个玩意对新手不友好一步配置错了能折腾好几天。你可以先用一个简单的拦截器实现思路定义一个注解在需要登录才能访问的接口上加上注解拦截器检测请求头里有没有合法的 Token没有就返回 401。等我写完这套代码你自然能理解真正的安全框架无非是在这套思路上做更精细的控制。5.3 文件上传接口的联通热搜词里有一条“前端上传一个文件后端接收后对文件进行处理处理完的新文件再返回给前端”。这个场景在 day4 也可以尝试简化版。后端用MultipartFile接收文件保存到本地磁盘的一个目录然后返回一个可以访问的 URL。前端拿到 URL 后可以直接展示图片或下载文件。不要觉得保存到本地很 low很多轻量级项目、内部系统就是这么干的只是生产环境通常把存储换成 OSS、MinIO 这类对象存储服务。核心思路是一样的接收文件、处理文件、暴露访问路径。真正要防的坑有两个一是上传目录必须配置成可写的并且要防止用户传可执行文件二是要对文件名做重命名处理避免中文文件名或路径穿越问题。6. 常见问题与排查经验6.1 后端学习中的高频故障点日报里很多同学都会问我同样的问题接口报 404、连接数据库超时、中文乱码、端口占用、依赖下载失败。我把这些高频故障整理成一张表方便你快速定位现象可能原因排查思路接口 404Controller 包路径不对或映射路径拼写错误检查启动类扫描包范围确认RequestMapping路径数据库连接超时服务没启动、连接串写错、密码不对先用命令行连接再检查 URL 格式和用户名密码中文乱码数据库字符集不是 utf8mb4或连接串没指定编码检查建库字符集检查连接串参数端口被占用上一次启动没关闭或其它应用占用 8080换端口或杀掉占用进程依赖下载失败Maven 源不是国内镜像或网络问题配置阿里云镜像强制 reload 项目Invalid bound statementMapper.xml 扫描路径不对或方法名与 id 不一致检查mybatis.mapper-locations和 method 对应关系6.2 网上流传的“后端八股”要不要背你打开搜索引擎输入“后端”两个字出来最多的就是“后端八股文”“后端面试题”“java后端面试项目”。我的建议是day4 阶段完全不需要背八股。你现在背了也理解不了等真正写代码写到第五六个项目时很多所谓的“八股点”自然就变成常识了。背题应该发生在学习了一个技术、做了对应项目、有了体感之后而不是在还没有体感的时候去死记硬背那样面试官一问到细节照样露馅。6.3 实战中遇到问题的排查顺序我在排查后端接口问题时有一套自己的固定顺序先看控制台有没有报错堆栈再看浏览器 Network 面板的请求参数和响应内容然后用命令行或浏览器直接调接口最后看数据库里有没有产生数据变化。这套顺序尽量从现象向根因推进一个接口出问题不要马上怀疑框架有 bug大多数时候都是参数没传对、SQL 写错了、字段名不匹配这些看起来毫不起眼的低级问题。7. day4 的最终练习作业如果前面六个章节的内容你都看懂了那最后花点时间完成这个练习做一个简单的“用户注册 用户列表”功能前端用一个静态 HTML 页面后端用 Spring Boot 提供接口。注册接口接收用户名、邮箱写入user_info表列表接口按创建时间倒序返回所有用户。跨域和统一返回结构的代码从上面贴的配置里抄一遍然后改一改字段名。完成后你会对“后端”这个词有一个完全不同于第一天的理解后端不是某一个具体的类也不是某一个框架而是一整套处理数据、提供服务、与前端配合的流程。后端这条路的技术栈很长Java、Spring Boot、MySQL、Redis、消息队列、容器、微服务每一项拉出来都能研究很久。但 day4 这个阶段的里程碑只有一个你亲手写出了一个完整的、数据真实落库的接口并且知道前后端是怎么通过 HTTP 联通起来的。如果你真的走完了这个流程哪怕代码写得丑一点、结构乱一点都算做到了。我在实际项目里写过好几年后端回头看最感谢的不是某个复杂框架而是最初认真写完的那几个增删改查接口。它们让我建立了对数据流转的直觉知道一个请求从浏览器出发经过 DNS、Nginx、应用服务器、数据库最后又返回浏览器中间每一步大概发生了什么。这种全局感越早建立越好。下一篇笔记我会出一套完整的项目目录结构和接口规范文档把那套我自己对比了多家公司后沉淀的代码组织方式分享出来到时候你会用更省力的姿势写后端。