Repository 与 DAO

资源库(Repository)             ------   查阅一些资料,小见解

    协调领域和数据层映射层,利用类似于集合的接口来访问领域对象。

    它将分离了数据库访问层跟领域对象的代码细节。

    Repository在新解释中,其有两中分类:面向集合的资源库 跟 面向数据库的资源库。

    面向集合方式的资源库:

        访问方式近似于集合操作。通常从集合中获取得到领域对象,改领域对象在操作改变数据之后,再次从资源库或取改对象,其值跟原来的领域修改过的领域对象值一至。

简单的面向集合方式的Repository一般有

add() , remove(), get() 这些方法。 不同于,面向数据库型的Repository,在获取某一领域对象修改后要额外调用save()方法,来同步原来Repository数据。

public class TestProductRepository
{
    public void testIdof()
    {
        Product found = Registry.productRepository()
                            .prodcutOf(new ProductId(1L));
        
        
        found.name("New Name");

        Product otherFound = Registry.productRepository()
                                .productOf(new Prodcut(1L));
        
        assertEquals( found.name(), otherFound.name()  );
    }
}



上面测试例子说明在修改在Reposiotry取出来的领域对象引用操作改变后,跟你再一次从Repository中取出一致的。

    在hibernate中,session关闭时检查相关对象dirty状态,进行与数据库同步,使得我们可以实现面向集合方式的Repository。

     面向数据库方式的Repository

与面向集合方式的Repository类似,主要区别在于,我们需要save()方式,让新修改数据同步到Repository中去。

public class TestProductRepository
{
    public void testIdof()
    {
        Product found = Registry.productRepository()
                            .prodcutOf(new ProductId(1L));
        
        
        found.name("New Name");

        Product otherFound = Registry.productRepository()
                                .productOf(new Prodcut(1L));
        
        assertNotEquals( found.name(), otherFound.name()  );

        
        Registry.productRepository().save(found);
        

         otherFound = Registry.productRepository()
                          .productOf(new Prodcut(1L));
        

        assertEquals( found.name(), otherFound.name()  );
    }
}

Repository 与 DAO

    有时Reposiotry与DAO被当作同意词看待。有一个明显的区分。

    DAO通常是对数据库表的封装,当我们使用事务脚本时,经常创建贫血的只有简单get/set的对象,大多根据一行数据的映射。DAO对这一层的数据库访问进行、封装,可以看待为对数据的CRUD,交由事务脚本处理。

    Reposiotry使用数据映射器或其他技术,进行存储与获取操作是的领域对象,可能是一系列的聚合或实体,更加的面向对象,同时也有着对数据访问层的封装。

    通常我们可以将Reposiotry跟DAO一样看待,但我们知道Repository是面向领域模型的,而DAO则面向的是数据的。

    


转载于:https://my.oschina.net/XzhiF/blog/265165

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Repository层和DAO的区别在于,Repository层是Spring框架中的一种设计模式,它是对DAO层的进一步封装和抽象,提供了更高层次的抽象和更加灵活的查询方式,同时也可以与其他框架集成。而DAO层则是数据访问层,主要负责与数据库进行交互,进行数据的增删改查等操作。因此,Repository层更加注重业务逻辑的处理和数据的封装,而DAO层则更加注重数据的访问和操作。 ### 回答2: Repository层和DAO(Data Access Object)在软件开发领域被广泛运用,是持久化层的两个概念。它们的主要区别在于: 1. 设计层面:DAO与具体的数据源进行交互,可以理解为对数据源的封装,同时负责数据访问和数据持久化的任务。而Repository层则更加高层抽象,不仅要负责对数据源的操作,还要对操作结果进行解释和加工,是对DAO层的进一步封装。 2. 对象层面:在设计模式上,DAO层通常为实体类提供单纯的数据访问,而在Repository层中实体类的处理则更加复杂,包括实体类与其他模型之间的转换等。 3. 维护层面:在Repository层中,可以通过重写方法、缓存等方法提高代码的复用性,这样就不需要在DAO层中管理重复代码的复杂性。同时在对于实体类的维护,也更加具有优越性。 综上所述,虽然DAORepository层都是持久化层的两个概念,但是它们在设计、实现、维护等方面都存在很大的差异。DAO层主要负责对应数据源的CURD操作,它更加偏向于数据访问和持久化。而Repository层则更加注重领域对象的逻辑操作,给予了更高层的抽象和更多的功能,扩展了对于软件面向对象的处理能力,但是Repository层的复杂性更高,需要在实际设计中结合项目的特点和开发人员的经验进行选择。 ### 回答3: Repository层和Dao层是很多应用程序中常用的两种设计模式,在由Java语言开发的Web应用程序中,他们主要用来处理数据持久层和数据库操作。 Repo是Repository的缩写,是指存储库。Repository层是一种抽象的接口层,负责数据持久化存储和查询,承担了所有的与数据存储相关的工作,也是应用程序与持久化框架之间的中间件。它对上层提供统一的接口方法,封装了Dao层,而内部实现则可以采用不同的框架(如MyBatis和Hibernate)。 Dao是Data Access Object的缩写,直译为数据访问对象,他的主要任务是封装数据库的访问,Dao对象提供了一系列的接口,用于对数据的增、删、改、查等操作。Dao层对于上层提供了一种对数据的存储和查询的持久化方法的抽象,但和Repository层不同的是,Dao着重于数据访问的实现,而不是业务逻辑的处理。 Repository层是面向领域模型的,它关注整个领域的需求,而不是单一的数据库操作,通过统一接口、多种实现的方式,将增删改查等数据访问方法封装在一个类中,从而调用起来更加方便,更加规范。一般而言,Repository是同时面向服务层和持久层的。 而Dao层专注于对数据的访问操作,它具有更加细粒度的操作,适用于面向更多的特定需求和数据访问的需求。Dao与JDBC非常类似,它们都是对数据层的操作进行抽象,Dao层将JDBC数据处理的功能封装为一个实现通用数据访问接口的类,屏蔽了数据访问细节,Facade层可以调用Dao层做数据访问,而无需直接操作JDBC。 综上所述,Repository层和Dao层都是数据持久化的方法,二者的区别在于,Repository层是对Dao层的进一步封装,用来将不同的数据源拼合成一个大的Repository接口,并且为其提供统一的接口方式,而Dao层则是对数据的访问和操作的抽象。个人认为,在设计应用程序时,应该根据具体的需求,选择不同的持久层接口,因此在开发过程中,RepositoryDao都有自己适用的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值