Spring Boot 分层架构详解:Controller、Service、Mapper...

在构建企业级后端应用时,良好的分层架构 不仅能提升代码的可读性和可维护性,也能帮助团队实现职责清晰、功能复用的目标。本文将详细介绍

Spring Boot 项目中常见的分层结构,重点讲解 Controller、Service、Mapper 各层的职责、使用方式与最佳实践。


📚 一、为什么要分层?

我们在开发 Spring Boot 项目时,并不是所有代码堆在一个类里,而是根据功能职责划分为不同的"层",以实现:

  • 职责清晰
  • 降低耦合
  • 易于测试
  • 易于扩展和维护

这就是典型的 MVC(Model-View-Controller)+ Service + DAO 架构。


🧱 二、Spring Boot 项目的典型分层结构

层级 英文名称 主要职责 是否写 SQL 是否处理业务 是否响应请求
表现层 Controller 接收前端 HTTP 请求、处理参数、调用业务逻辑、返回响应结果 ❌ ❌(只转发) ✅
业务逻辑层 Service 封装业务逻辑、事务控制、调用数据访问接口、组织业务流程 ❌ ✅ ❌
数据访问层 Mapper / DAO 定义数据库操作,配合 XML 或注解执行 SQL ✅ ❌ ❌
数据模型层 Entity / Model 封装数据库表结构对应的数据对象,进行前后端数据传输 ❌ ❌ ❌
配置层 Config 配置类,如数据源、拦截器、跨域处理、安全策略等 ❌ ❌ ❌
启动器层 Application 应用程序启动入口,加载配置并启动 Spring Boot 环境 ❌ ❌ ❌

📁 三、目录结构推荐

一个标准的 Spring Boot + MyBatis 项目结构如下:

复制代码
src/
 └── main/
     ├── java/com/example/demo/
     │   ├── controller/     // 接收请求
     │   ├── service/        // 编写业务逻辑
     │   ├── mapper/         // 与数据库交互
     │   ├── model/          // 数据对象(Entity)
     │   ├── config/         // 配置类
     │   └── DemoApplication.java
     └── resources/
         ├── mapper/         // MyBatis XML 文件
         └── application.yml // 配置文件

🧩 四、各层职责详解

✅ 1. Controller ------ 表现层

  • 接收 HTTP 请求(@GetMapping/@PostMapping)
  • 处理请求参数(@RequestParam/@RequestBody)
  • 调用 Service 进行业务处理
  • 返回响应结果(ResponseEntity/JSON)

示例:

java 复制代码
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}

✅ 2. Service ------ 业务逻辑层

  • 编写业务逻辑(如注册、下单、积分计算等)
  • 事务控制(使用 @Transactional)
  • 调用多个 Mapper 或外部服务
  • 拆分复杂业务流程,提升可复用性

示例:

java 复制代码
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }
}

✅ 3. Mapper ------ 数据访问层(DAO)

  • 编写 SQL 语句(使用 MyBatis 注解或 XML)
  • 与数据库进行交互(增删改查)
  • 不处理业务逻辑,仅作为数据库操作的封装器

示例(注解方式):

java 复制代码
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);
}

示例(XML 方式):

xml 复制代码
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="selectById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

✅ 4. Model ------ 数据模型层

  • 定义实体类,用于封装数据库字段
  • 一般对应数据库中的一张表
  • 用作 Controller 与 Service 之间传递的数据对象

示例:

java 复制代码
@Data
public class User {
    private Long id;
    private String username;
    private String email;
}

💡 五、常见疑问解答

❓1. Controller 可以代替 Service 吗?

从技术上讲:可以写在一起。

从架构上讲:绝对不推荐!

👉 原因:

  • Controller 是面向接口的,只管"接收"与"响应"
  • Service 专注处理业务,解耦逻辑,有利于测试、复用、事务控制

❓2. Controller 可以代替 Mapper 或 XML 吗?

完全不能。

  • Controller 不应该操作数据库;
  • Mapper/XML 专门用来写 SQL;
  • 控制层不应承担数据库逻辑。

✅ 六、总结

Controller 管接口,Service 管逻辑,Mapper 管数据库,Model 管数据结构。


相关推荐
IT_陈寒15 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala15 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
计算机毕设定制辅导-无忧学长17 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
wo_jack19 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
量化分析码农20 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
isboyjc20 小时前
Lomo Agent:面向创作型、持续协作 Agent 的架构设计与工程实践
人工智能·架构·agent
GISer_Jing21 小时前
如何学习Agent
后端·langchain
聪明的笨猪猪21 小时前
AI应用架构选型:架构师的核心决策困境与权衡
经验分享·面试·架构
JWASX1 天前
【Go】map 源码解析 - group
后端·golang·map·源码分析
量化分析码农1 天前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端