自学教程 学编程从这里开始

数据访问对象模式

《DAO 数据访问对象模式》|企业应用架构模式

关键词:DAO、数据访问层、隔离业务与数据库、持久层封装

一、什么是DAO模式

DAO(Data Access Object,数据访问对象):用来隔离业务逻辑层与数据持久层。DAO 负责封装所有数据库操作(CRUD),向上暴露领域对象接口;上层业务不需要关心数据库类型、SQL、JDBC细节。

核心意图
分离业务代码和数据访问代码;数据库变更(MySQL→Oracle)不影响上层业务。

角色

  1. DAO Interface(DAO接口):定义数据操作抽象方法(CRUD)
  2. DAO Impl(DAO实现类):实现接口,写JDBC/MyBatis操作数据库
  3. Model / VO / DTO:数据实体,承载从数据库读出的数据
  4. 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,屏蔽表概念

四、优缺点

✅ 优点

  1. 持久层与业务层解耦,上层不关心数据库实现
  2. 统一管理数据库操作,SQL集中在DAO层
  3. 方便切换数据库,便于单元测试(Mock DAO)

❌ 缺点

  1. 简单项目增加代码量,需要接口+实现+实体
  2. 多层封装,增加调用链路

五、框架应用

  • Java EE 标准DAO思想
  • MyBatis Mapper 本质就是DAO
  • Spring Data JPA 的 Repository 是DAO的升级变体

六、小结

DAO 属于企业应用架构模式,不是GOF23;它解决分层架构中持久层的隔离问题。

内部实现时经常会用到 GOF 模式:工厂模式、单例、策略模式。

0 条笔记