《DAO 数据访问对象模式》|企业应用架构模式
关键词:DAO、数据访问层、隔离业务与数据库、持久层封装
一、什么是DAO模式
DAO(Data Access Object,数据访问对象):用来隔离业务逻辑层与数据持久层。DAO 负责封装所有数据库操作(CRUD),向上暴露领域对象接口;上层业务不需要关心数据库类型、SQL、JDBC细节。

核心意图
分离业务代码和数据访问代码;数据库变更(MySQL→Oracle)不影响上层业务。
角色
- DAO Interface(DAO接口):定义数据操作抽象方法(CRUD)
- DAO Impl(DAO实现类):实现接口,写JDBC/MyBatis操作数据库
- Model / VO / DTO:数据实体,承载从数据库读出的数据
- Business Object(业务对象BO):业务层,调用DAO,不感知数据库

数据流:
Business Object → DAO Interface → DAOImpl → DB
二、Java简易示例
// Model
public class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
// DAO Interface
public interface UserDao {
User findById(Integer id);
void save(User user);
}
// DAO Impl
public class UserDaoImpl implements UserDao {
@Override
public User findById(Integer id) {
// simulate DB query
return new User(id, "User_" + id);
}
@Override
public void save(User user) {
System.out.println("Save user to DB: " + user.getName());
}
}
// Business Object
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public User getUser(Integer id) {
return userDao.findById(id);
}
}
// Client
public class Client {
public static void main(String[] args) {
UserDao dao = new UserDaoImpl();
UserService service = new UserService(dao);
User user = service.getUser(1001);
System.out.println("User name: " + user.getName());
dao.save(user);
}
}
输出:
User name: User_1001
Save user to DB: User_1001
三、DAO vs Repository
| 模式 | 侧重点 |
|---|---|
| DAO | 偏向数据库表,封装CRUD,贴近数据库 |
| Repository | 偏向领域集合,像内存集合,领域驱动DDD,屏蔽表概念 |
四、优缺点
✅ 优点
- 持久层与业务层解耦,上层不关心数据库实现
- 统一管理数据库操作,SQL集中在DAO层
- 方便切换数据库,便于单元测试(Mock DAO)
❌ 缺点
- 简单项目增加代码量,需要接口+实现+实体
- 多层封装,增加调用链路
五、框架应用
- Java EE 标准DAO思想
- MyBatis Mapper 本质就是DAO
- Spring Data JPA 的 Repository 是DAO的升级变体
六、小结
DAO 属于企业应用架构模式,不是GOF23;它解决分层架构中持久层的隔离问题。
内部实现时经常会用到 GOF 模式:工厂模式、单例、策略模式。
0 条笔记