目录

DAO和Repository的区别

分开解释

Repository:对象仓库。用于对象全部管理,贯穿整个对象的声明周期。

DAO(Data Access Object) :数据访问对象是一个面向对象的数据库接口,负责对数据库的CRUD。

基本关系

Repository通过DAO进行数据库的对象的管理

高阶讨论

使用了持久化框架如Hibernate、Mybatis(Plus)等,无需区分Repository与DAO


Repository是对象的仓库,也就是保存对象的地方,这个仓库就是我们普通意义的仓库,一个真正OO系统,业务层是围绕活动的对象进行,活动的对象是从仓库中获取的,也是通过交给仓库进行对象长久保管,也就是持久化意思,说白了,就是保存到数据库。

而DAO则没有如此OO概念,DAO是Data access Object,DAO中有数据概念,还是没有摆脱数据库的影子。

所以,Repository替代DAO,是OO深入的趋势,但是在具体处理中,由于性能或设计不够周到或者一些事情把握不定,DAO还会继续存在一段时间,属于过渡式消失。

Repository和DAO两个概念比较中发现,Repository是相对对象而言,而DAO是相对数据库而言,只要我们还是使用关系数据库保存对象,也可能这两者都同时存在,因为侧重点不一样,但是可以肯定的是,业务层应该直接和Repository打交道,而不是DAO.


Repository=对象管理(对象工厂+对象缓存+…)+DAO,JiveJdon3中将缓存放在DAO中现在觉得不恰当


Repository的对象可以对外进行解释,如专业人员认为的订单,商品等,

DAO更偏于开发人员为了实现开发目的而产生的对象,如外键关系、包含关系等。


DAO是对象访问接口类

接口类=方法的管理类

就是操作数据库的具体方法的类

User

UserDAOImpl 就是管理怎么把User对象存进取出数据库的具体方法的类

repository是对象仓库类

仓库类=对象的管理类

User

UserRepository 就是管理怎么样才能有效的访问User类的类

UserRepository在必要的时候才调用UserDAOImpl去操作数据库

你也可以吧UserRepository理解为UserCache,当然Repository不仅仅是cache的功能


简单的例子就是如果你有一个Model Object包含着一些Value Object,那么每个Object都回有相应的一个DAO,因为DAO都已经告诉你叫作Data access object,所以,每一个object都需要一个dao来做数据库等地层数据处理。

Reposirtory是对每一个Model Object来说的,一个Reposirtory基本上对应一个Model Object.

比如Person 包含一些Value Object比如address, work 等等,那么

Person就有一个Reposirtory,它里面有相关的方法比如,只是单纯的取出一个Person,然后Load相关的address和work在需要的时候,因为,有时候你不需要一次把所有的Value Object在一个Model Object提取的时候都一次性提出来,那样子叶增加系统负担也会造成资源浪费。

说白了就是Model Object有Reposirtory而Value Object没有,Value Object的基本操作可以用Dao而DDD有明确说明一般所有的对象操作都要面向的是Model Object。


Reposirtory提供对象管理, 管理对象可以通过DAO写入数据库或读取数据库组装对象,或者放入缓存等,这些业务层都不需要知道,业务层只对Reposirtory要求对象管理。

DAO就是数据库访问层,提供数据库CRUD操作。被包含在Reposirtory之内。

如果业务层直接调用DAO层,那么系统设计应该趋向数据库设计。


Repository 是放在BLL的,作为BL访问存取的地方。

而DAO可看成DAL提供BLL的接口,是放在DAL的

至于DAO是不是取消,就看DAL的设计了

业务是只管从仓库(Repository)中取出他所需要的对象,而不关心是从哪里存取,这些是Repository 的事情,Repository 可能通过DAO将数据完成持久化


repository是domain概念,dao是program概念。主要是看问题的角度和层次不同。