阿里一面经典考题:Java项目中,数据库操作应该放在哪一层?别再写在Controller里了
前言
后端面试经常被问到架构分层相关问题:Java代码在哪一层操作数据库?
不少初学者分不清层次边界,有人把数据库查询写在Controller,也有人分不清Service和DAO职责。一旦回答模糊,面试官会直接质疑你的工程编码规范、架构认知。
本文结合经典后端分层架构,讲清楚数据库操作归属层级、每层职责、常见错误写法,同时整理面试标准回答,看完面试不踩坑。
一、标准分层架构(后端经典四层架构)
主流Java Web / SpringBoot项目标准分层自上而下:
- Controller 控制层:接收前端请求、参数校验、响应封装
- Service 业务层:编写业务逻辑、事务控制、组装数据
- DAO / Mapper 持久层(数据访问层):专门负责和数据库交互
- 数据库(MySQL/Oracle等):存储数据
✅ 核心结论:
Java中直接操作数据库的代码,放在 DAO(Mapper)持久层。
二、每层详细职责,划清边界
1. Controller 控制层
职责:接收HTTP请求,调用Service,返回结果。
❌ 禁止:直接写SQL、调用数据库。
Controller只处理请求流转,不碰数据库。
2. Service 业务层
职责:业务逻辑编排、事务控制、复杂计算、多个DAO调用组合。
✅ Service可以调用DAO,但Service内部不直接写SQL、不直接操作数据库。
简单理解:Service指挥DAO去查库,自己不亲手操作数据库。
3. DAO / Mapper 持久层(Data Access Object)
职责:
- 编写SQL语句(XML/注解SQL)
- 建立与数据库交互
- 执行查询、新增、更新、删除
- 返回原始数据给Service
MyBatis项目中就是Mapper接口 + Mapper.xml;
JPA项目中就是Repository,都属于持久层。
👉这是唯一允许直接和数据库打交道的层级。
4. 数据库
磁盘存储数据,接收DAO发送的SQL,执行并返回结果。
三、标准调用流向
前端 → Controller → Service → DAO(Mapper) → MySQL
数据返回反向回流:MySQL → DAO → Service → Controller → 前端
四、举一段规范示例(SpringBoot + MyBatis)
// Controller 只调用Service,不操作数据库@RestControllerpublicclassUserController{@AutowiredprivateUserServiceuserService;@GetMapping("/user/{id}")publicUsergetUser(Longid){returnuserService.getById(id);}}// Service:业务逻辑,调用Mapper,不写SQL@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateUserMapperuserMapper;@OverridepublicUsergetById(Longid){returnuserMapper.selectById(id);}}// Mapper(DAO持久层):真正执行数据库操作@MapperpublicinterfaceUserMapper{UserselectById(Longid);}五、高频错误写法(面试扣分点)
❌ 错误1:Controller 直接注入Mapper操作数据库
业务散落在接口层,无法复用、难以添加事务,代码极度混乱。
❌ 错误2:在Service中拼接SQL、直接使用JDBC连接数据库
破坏分层,SQL散落在业务代码中,难以维护。
❌ 错误3:DAO层处理复杂业务判断
DAO只做简单CRUD,业务判断、多表数据组装统一交给Service。
六、面试官延伸追问预判(附赠回答思路)
追问1:为什么不能把数据库操作写到Controller?
答:
- 代码无法复用,多个接口需要相同查询时重复编码;
- 事务只能标注在Service层,Controller无法统一管理事务;
- 职责混乱,不符合单一职责、分层解耦思想;
- 不方便统一对数据库操作做日志、缓存统一封装。
追问2:Service和DAO的分界线是什么?
DAO:单纯CRUD,只负责和数据库通信;
Service:业务逻辑、流程控制、事务、多个DAO组合调用。
七、面试一句话标准答案
在经典四层架构中,直接操作数据库的代码放在DAO/Mapper持久层;Service业务层调用持久层,负责业务逻辑与事务,不直接操作数据库;Controller只处理请求转发,禁止访问数据库。
总结
分层思想不只是编码规范,更是工程化、团队协作的基础。
记住核心要点:DAO负责操作数据库,Service负责业务,Controller负责接收请求。面试按这套逻辑作答,架构分层问题稳稳拿下。