从零开始: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:数据载体
