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

从零开始:Spring Boot + MyBatis 搭建后端接口完整教程

前言:

你是否刚接触 Spring Boot,面对一堆配置不知从何下手?是否看了很多教程,却还是搞不清 Controller、Service、Mapper 到底谁先谁后?

本文带你从零开始,手把手搭建一个完整的 Spring Boot + MyBatis 项目。不绕弯子,不堆砌代码,只讲最核心的一个查询接口。从创建项目、配置数据库、到编写每一层代码,最后成功返回 JSON 数据,每一步都有清晰的代码和通俗的解释。

读完本文,你将彻底理解 Spring Boot 的四层架构,并能独立开发一个完整的数据查询接口。


Spring Boot + MyBatis 开发接口步骤详解

第一步:创建项目

名称:按需填写(建议英文名称)

类型:一定要选择Maven

JDK:选择17

Java:这里选择17

依赖:添加图中四个基础的依赖,都可以直接搜索添加


第二步:手动创建基础项目结构

springboot-demo/ ├── src/main/java/com/example/demo/ │ ├── DemoApplication.java # 启动类 │ ├── controller/ │ │ └── UserController.java # 控制器 │ ├── service/ │ │ ├── UserService.java # 服务接口 │ │ └── impl/ │ │ └── UserServiceImpl.java # 服务实现 │ ├── mapper/ │ │ └── UserMapper.java # 数据访问接口 │ └── entity/ │ └── User.java # 实体类 ├── src/main/resources/ │ ├── application.yml # 配置文件 │ └── mapper/ │ └── UserMapper.xml # SQL映射文件 └── pom.xml # 依赖配置

第三步:写配置文件

位置:resources/application.yml

spring: datasource: url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username: 你的数据库账号 password: 你的数据库密码 mybatis: mapper-locations: classpath:mapper/*.xml

解释:

  • 配置数据库连接和 MyBatis 设置。
  • url中的“test_db”是你的数据库表名,还需要设置你的数据库账号密码

第四步:创建数据库表

-- 1. 创建数据库 CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 使用数据库 USE test_db; -- 3. 创建用户表 CREATE TABLE IF NOT EXISTS `user` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID', `name` VARCHAR(50) NOT NULL COMMENT '用户名', `age` INT COMMENT '年龄', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 4. 插入模拟数据 INSERT INTO `user` (`name`, `age`) VALUES ('张三', 25), ('李四', 30);

第五步:创建实体类(Entity)

@Data public class User { private Long id; // 用户ID private String name; // 用户名 private Integer age; // 年龄 }

解释:

  • 实体类对应数据库的一张表。类名对应表名,属性对应表的字段。比如 User 类对应 user 表,name 属性对应 name 字段。
  • 添加@Data注解就不用再手动去添加getting和setting了

第六步:创建 Controller 层

@RestController // 处理HTTP请求,返回JSON数据 @RequestMapping("/users") // 这个Controller处理 /users 开头的请求 public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") // 处理 GET /users/123 这种请求 public User getUser(@PathVariable Long id) { // @PathVariable从URL中取参数 return userService.getUserById(id); // 调用Service } }

解释:

  • @RestController:告诉 Spring 这个类处理 HTTP 请求,并且方法返回的结果直接转成 JSON

  • @RequestMapping("/users"):所有请求路径都以/users开头

  • @GetMapping("/{id}"):只处理 GET 请求,{id}是路径变量

  • @PathVariable:把 URL 中的{id}赋值给方法参数


第七步:创建 Service 层

接口:

public interface UserService { User getUserById(Long id); }

实现类:

@Service // 交给Spring管理 public class UserServiceImpl implements UserService { @Autowired // 自动注入Mapper private UserMapper userMapper; @Override public User getUserById(Long id) { return userMapper.findById(id); // 调用Mapper执行SQL } }

解释:

  • @Service:Spring 会创建这个类的实例并管理它

  • @Autowired:Spring 自动把 UserMapper 的实现对象赋值进来

  • Service 层的作用:业务逻辑处理,比如参数校验、权限判断。目前很简单,直接调 Mapper


第八步:创建 Mapper 接口

@Mapper // 告诉Spring这是MyBatis的映射器 public interface UserMapper { User findById(@Param("id") Long id); // 根据ID查询用户 }

解释:

  • @Mapper:Spring 会为这个接口自动生成实现类

  • findById:方法名对应 SQL 的 id

  • @Param("id"):把参数传给 SQL 语句


第九步: 编写 SQL 映射文件(Mapper.xml)

<mapper namespace="com.example.demo.mapper.UserMapper"> <select id="findById" resultType="com.example.demo.entity.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> </mapper>

解释:

  • namespace:必须指向上面那个 Mapper 接口的全路径

  • select标签:表示这是一个查询操作

  • id:对应 Mapper 接口的方法名

  • resultType:查询结果要转换成哪个实体类

  • #{id}:占位符,会被方法传进来的参数替换

为什么要有这个文件?把 SQL 语句从 Java 代码中分离出来,方便管理和优化 SQL


第十步:添加 Mapper 扫描,并运行DemoApplication类的 main 方法

@SpringBootApplication @MapperScan("com.example.demo.mapper") // 扫描Mapper接口所在包 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

解释:@MapperScan告诉 Spring 去哪里找@Mapper注解的接口,自动生成实现类。

访问http://localhost:8080/users/1


请求流程总结

text

HTTP请求 → Controller → Service → Mapper → SQL → 数据库 ↓ ↓ ↓ ↓ /users/1 接收参数 业务逻辑 执行SQL ↓ 返回JSON

每一步的职责:

  • Controller:接收请求、参数校验、返回结果

  • Service:业务逻辑处理

  • Mapper:数据库操作

  • Entity:数据载体

http://www.jsqmd.com/news/675389/

相关文章:

  • Linux---信号
  • 线性代数与矩阵运算:AI世界的数学基石——从SVD到特征值分解的实战解析
  • 基于Simulink的轴向磁通电机多物理场耦合仿真​
  • NativeScript APP 开发备忘
  • GitHub 上的 CI/CD 怎么用?从 GitHub Actions 到一条可上线的流水线
  • 学Simulink——基于Simulink的电机参数在线辨识与自适应控制​
  • 我第一次做 OData 后端服务时,真正绊住我的,不是代码,而是 Cloud Foundry 里的这些基础坑
  • yolov8模型训练MOT20数据集 行人多目标跟踪计数数据集的训练及应用 如何根据mot20数据集 来实现行人目标识别,行人追踪,行人的计数
  • Linux命令:ifconfig
  • 在 Word 中,一个公式就能看出你会不会高效排版
  • LumiPixel Canvas Quest与其他开源模型的对比评测
  • 双链表详解
  • Qianfan-OCR入门指南:如何扩展自定义解析模式(如专利权利要求提取)
  • [力扣 105]二叉树前中后序遍历精讲:原理、实现与二叉树还原
  • 如何让全面战争MOD开发从繁琐变得优雅:RPFM的现代化解决方案
  • OpenClaw Web 界面集成教程|通过网页与你的 AI 智能体对话
  • iFakeLocation:你的iOS虚拟定位终极指南,三分钟学会位置模拟
  • 终极免费开源字体Bebas Neue:如何解决现代设计的标题字体难题
  • 电力设备类输电线路覆冰检测数据集 json格式 2千张
  • 智慧课堂学生专注度分析:基于cv_resnet101_face-detection_cvpr22papermogface 的试点研究
  • RexUniNLU模型安全部署指南:权限控制与数据加密
  • 告别论文内耗!2026 年 10 大 AI 论文工具盘点,本科写作一站式通关
  • Qwen3-VL:30B多场景应用:飞书文档解读、会议纪要生成、截图问答等实战案例
  • 中国汽车工业的全球崛起
  • 5分钟掌握智慧树刷课插件:让网课学习效率翻倍的终极指南
  • tao-8k Embedding模型效果展示:抖音短视频文案语义去重与创意聚类
  • 2026世界迈入AI电影时代:全球首部纯AI生成院线长片《第一大道》开启新纪元
  • Seata和Saga 比较和总结
  • nli-MiniLM2-L6-H768效果展示:真实业务语料下的92.3% NLI准确率案例集
  • nli-MiniLM2-L6-H768入门指南:为什么它不是聊天模型?NLI任务本质与适用边界解析