暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一分钟理解DAO和Repository

整码阁 2021-07-18
5470
DAORepository是两个容易混淆的概念,经常被拿来比较理解。
DAO
DAO是Data Access Object的缩写,是一种结构型设计模式,用于分离业务层(应用)和持久化层(数据库)
DAO模式是一种分层的思想,这层就是用于处理和数据库交互(CRUD),而业务层不需要知道DAO层的实现细节。
DAO模式可以理解为数据库操作的简单封装,仅此而已。
示例
public interface Dao<T> {
Optional<T> get(long id);
List<T> getAll();
void save(T t);
void update(T t, String[] params);
void delete(T t);
}
复制
public class UserDao implements Dao<User{
private List<User> users = new ArrayList<>();

public UserDao() {
users.add(new User("John", "john@domain.com"));
users.add(new User("Susan", "susan@domain.com"));
}

@Override
public Optional<User> get(long id) {
return Optional.ofNullable(users.get((int) id));
}

@Override
public List<User> getAll() {
return users;
}

@Override
public void save(User user) {
users.add(user);
}

    // ...
}
复制
特点
 业务层不关心数据来源,它只依赖DAO接口,DAO实现的改变不影响服务层使用,例如从Mysql换成Postgresql,只需更换数据源和DAO实现;
 业务层只依赖DAO接口,解耦服务层和DAO实现,降低耦合度,符合“工作在接口,而不是实现”的OO原则;
 由于DAO的实现(持久层)完全独立,方便进行单元测试;
Repository
Repository《企业应用架构模式》中翻译为资源库,下文沿用。
定义1:Eric Evans的《领域驱动设计》 - 资源库是一种封装存储、查询和搜索行为的机制,它是模拟的对象集合。
定义2:Martin Fowler《企业应用架构模式》- 资源库位于领域模型和数据映射层之间,使用像集合一样的接口访问领域对象
理解
定义有点抽象,实际上资源库类似DAO,但它抽象程度更高,位于DAO之上的更高一层,更接近于业务层
资源库位于领域模型和数据映射层之间,就像一个位于内存的领域对象集合,提供一种管理领域对象的机制
资源库工作流程:业务层使用(近乎)自然语言构建查询条件提交给资源库,资源库执行对象增删等操作(就像操作集合一样),最后资源库自动将操作转为SQL的CRUD并执行。
资源库可以使用DAO执行数据查询,将返回结果转为领域对象,或新建领域对象,资源库执行新增操作,它自动转为DAO新增方法实现数据持久化。
资源库是领域驱动设计的概念,尤其适合于存在大量复杂领域对象的场景。
示例
public interface UserRepository {
User get(Long id);
void add(User user);
void update(User user);
void remove(User user);
}
复制
public class UserRepositoryImpl implements UserRepository {
private UserDaoImpl userDaoImpl;

@Override
public User get(Long id) {
User user = userDaoImpl.read(id);
return user;
}


@Override
public void add(User user) {
userDaoImpl.create(user);
}


// ...
}
复制
注意对比示例代码的差别
对比
  DAO抽象数据持久化,资源库抽象领域对象集合;
  DAO是底层概念,更接近数据库,资源库是高层概念,更接近领域对象(业务逻辑);
  DAO简单、通用,可以简单理解为CRUD的封装,操作对象是SQL语句,资源库复杂、抽象,可以理解为对领域模型的封装,操作对象是领域对象,不再关心数据库;
  DAO旨在隐藏数据库的复杂性,例如数据库连接和构造SQL语句,使CRUD更加简单,资源库旨在隐藏领域对象操作的复杂性,使领域业务逻辑更加清晰;
  DAO不能使用资源库,但资源库可以使用DAO,可以简单认为:资源库 = DAO + 领域对象;
文章转载自整码阁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论