目录
1. 什么是三层架构?
Web 应用常用 三层架构(Three-Tier Architecture) 来组织代码,核心思想是 分层解耦:
-
Controller 控制层
接收用户请求(如 HTTP 请求),调用业务逻辑,返回响应。 -
Service 业务层
处理业务逻辑(计算、规则判断、事务控制等)。 -
DAO 持久层(Data Access Object)
负责数据库的操作,封装增删改查
,只和数据库打交道。
三层架构 = 请求进入 → Controller → Service → DAO → 数据库 → 返回。
2. 三层的职责
(1) Controller 控制层
-
主要职责:接收请求、调用 Service、返回结果。
-
不应该写复杂逻辑,只做 调度。
-
框架:Spring MVC 的
@RestController
。
示例:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findUserById(id);
}
@PostMapping
public String addUser(@RequestBody User user) {
userService.saveUser(user);
return "新增成功";
}
}
(2) Service 业务层
-
主要职责:
-
实现业务逻辑(例如注册用户要校验用户名、加密密码等)。
-
控制事务。
-
组合多个 DAO 的方法完成复杂业务。
-
-
框架:Spring 的
@Service
。
示例:
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findUserById(Long id) {
return userDao.findById(id);
}
public void saveUser(User user) {
// 业务逻辑:例如加密密码
user.setPassword(MD5Util.encrypt(user.getPassword()));
userDao.insert(user);
}
}
(3) DAO 持久层
-
主要职责:操作数据库,封装 SQL。
-
不包含业务逻辑,只做数据访问。
-
框架:MyBatis、Hibernate、JPA 等。
示例(MyBatis):
@Mapper
public interface UserDao {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})")
void insert(User user);
}
3. 三层架构调用流程
用户 → Controller → Service → DAO → 数据库
比如一个 查询用户 的过程:
-
浏览器请求
/user/1
-
Controller 收到请求,调用
UserService.findUserById(1)
-
Service 里可能校验参数、做缓存处理,然后调用
UserDao.findById(1)
-
DAO 执行 SQL,返回 User 对象
-
Service 可能加工数据,再返回 Controller
-
Controller 返回 JSON 响应给前端
4. 三层架构的优点
✅ 分层解耦:每层职责清晰,修改互不影响。
✅ 易于维护:业务逻辑和数据库访问分开,代码清晰。
✅ 可扩展性强:方便做分布式、微服务。
✅ 利于测试:单元测试时可以 Mock DAO 层,测试 Service。
5. 三层架构的不足
❌ 代码稍显复杂:小项目可能显得繁琐。
❌ 层次过多:一些简单 CRUD 业务需要写很多文件。
❌ 性能开销:调用链长于简单架构。
6. 小结
-
Controller:只管请求和响应。
-
Service:专注业务逻辑和事务。
-
DAO:专门做数据操作。