`

dao domain的理解

阅读更多

一,Service ->DAO ,只能在Service 中注入DAO

二,DAO 只能操作但表数据,跨表操作放在Service 中,Service 尽量复用DAO ,只有一张表产生的业务放入DAO 中。

三,事务操作,放在一个DAO 中。

四,如果有更大Service 的之间的复杂调用,考虑在service 上再加Facade层(Components组件)。

五,多考虑这部分代码放在哪里,多里利用上下分层,增加代码可读性,提高代码复用率。

服务层处理业务逻辑,DAO 封装Entity对象,Action作为Controller处理分发。
业务逻辑是最容易变化的地方,当业务改变时,只增加修改相应的代码即可。真正享受分层带来的益处。

文章出处:http://www.diybl.com/course/3_program/java/javaxl/2008620/126932.html
 
 J2EE分层设计是Java企业应用的最基本的设计思想。

  从最常规的分层结构来说,系统层次从上到下依次为:

  表现层:主要是客户端的展示。

  服务层:直接为客户端提供的服务或功能。也是系统所能对外提供的功能。

  领域层:系统内的领域活动。

  DAO 层:数据访问对象,通过领域实体对象来操作数据库。

  其中有些指导原则:

  1、上层总是依赖其下层,依赖关系不跨层。

  2、表现成除外,同一层之间方法不允许相互调用。这是实际开发中一些开发者容易范的错误!如果真是同一层之间存在方法调用,需要注意,这些调用都是一些上层不可见方法,比如一些工具方法等。

  3、一切从服务层出发,从系统需要提供的功能进行分析,确定Service 接口中的方法。而不是从数据库的表出发,创建DAO ,再创Domain,然后Service ,这实际上是对系统分层的误解。

  4、系统最核心的设计就是将系统中的实体划分为领域模型。在此基础上设计数据的DAO 层,并将这些活动暴露给服务层,服务层的实现依赖于领域活动。

  5、每个接口的职责范围明确有界。

  在我所做的系统中,常常看到一些糟糕的编码:系统设计从表开始,一个表对应一个DAO ,一个DAO 对应一个domain,一个Domain对应一个Service ,实际上Service 的接口和DAO 的接口基本上完全一样!导致Service 的接口方法超多!到了表现层,前台程序员在写Action的时候,Action中反复的调用Service 方法,代码不堪入目。

  正确的设计应该是,一个领域活动会聚合对应一个或一组DAO ,来完成一个领域活动。而一个服务可能包含两个领域活动,比如一个转账的业务,对应两个领域活动。两个帐户的金额分别发生变化,需要操作一组领域活动,而每个活动需要操作很多表(调用多个DAO )。 事务的控制我们可以放到Service 层。

  目前,越来越多的架构师喜欢领域模型驱动设计,针对系统的领域模型建模,然后上层直接是ServiceService 下面就是领域活动层Activity,从而去掉了DAO 层,这样做的优点是系统设计思路更清晰,目标更明确。可以避免上面所说的一个表对应一个DAOService 的情况。

  但缺点是当领域活动发生变化的时候,会引起领域活动层代码的变化。并且,当要更换持久化框架或者技术时候,领域活动要重新实现。

  但综合考虑起来,这样带来的优点也很多,而实际上更换数据库和持久化框架的情况很少,因此这样的设计也是有其合理性一面的。这样做实际上是将原来的DAO 和Domain层合并为一个Activity.但上层的设计思路还是一致的。

  其实Service 层的设计也很讲究,其中就是要控制Service 的数量,从Service 层往下,接口数量逐层增加。通常将一个模块的服务都集中到一个Service 中来处理。

  每层中的每个接口都应该关注的是自己的那一块,而不是吃着碗里看着锅里,牛槽伸出个狗舌头,最典型的例子就是一个DAO 中胡乱操作别的表。这种凌乱的实现只会置项目经理与死地。也会为软件的维护带来很大代价。

  笔者曾遇到这样的团队,缺乏对整个项目的整体设计,一个表一个DAO ,对应一个Service ,系统也不大,三四十张表,但是性能相当地下,经常down机。

  最终发现,失败不是开源框架和数据库以及应用服务器和硬件配置的错,根源在于拙劣的设计导致。

  希望以后大家在做项目的时候能注意点

分享到:
评论

相关推荐

    java代码 根据domain自动生成DAO层 小tool(功能有待又垒加)

    根据提供的标题和描述,我们可以推测这是一个基于特定domain(领域模型)自动生成DAO层代码的小型工具,其功能可能还有待扩展和增强。 首先,我们需要理解DAO层的基本概念。DAO是数据访问对象,它提供了一种方法来...

    mybatis自动生成Dao、Mapper和Domain工具

    MyBatis Generator(MBG)是MyBatis的一个配套工具,用于自动生成MyBatis的DAO、Mapper和Domain(实体类)文件,极大地提高了开发效率,减少了手动编写这些基础代码的工作量。 MyBatis Generator通过XML配置文件...

    action层,dao层 ,service层,entity层1

    在软件开发领域,尤其是Java Web应用中,我们经常会遇到一种分层架构的设计模式,这种模式将应用程序的不同功能划分...同时,通过良好的接口设计,各层之间可以松耦合,降低了组件间的依赖,使得系统更易于理解和调试。

    项目model、Dao层、业务层建模工具类

    在IT行业中,建模是软件开发过程中的一个重要环节,它帮助我们清晰地理解系统的结构和功能,便于设计和实现。本资源提供了一种用于项目model、Dao层、业务层建模的工具类,旨在简化开发流程,提高代码复用性。下面...

    关于dao设计模式学习资料

    DAO设计模式实际上是由两个模式组成的:DataAccessor模式和ActiveDomainObject模式。 - **DataAccessor模式**:实现了数据访问和业务逻辑的分离。该模式通过提供一套抽象的数据访问接口,使得业务逻辑层不必直接...

    java模式_DAO模式[汇编].pdf

    DAO(Data Access Object)设计模式是Java开发中用于处理数据访问的一种常见模式,它结合了Data Accessor模式和Active Domain Object模式。DAO模式的主要目的是为了分离数据访问逻辑和业务逻辑,提高代码的可读性、...

    springmvc深入解析.pdf

    在org.springframework.samples.jpetstore.domain包中,包含了在整个JPetStore各个层中都会使用到的domain object。这些基本的model类,除了Cart,在数据访问层均有对应的Dao类,而由于Cart仅作为在Web层内部传递的...

    Java MVC framework, agile, fast, rich domain model, made e.zip

    "fast"和"rich domain model"可能是在强调Java MVC框架在处理复杂业务逻辑时的高效性能和强大的领域模型支持。领域模型是业务对象在软件中的表示,它封装了业务规则和数据。一个丰富的领域模型可以帮助开发者更好地...

    springboott创建maven多模块项目1

    3. `user-service`:服务层,处理业务逻辑,依赖于`user-dao`和`user-domain`。 4. `user-web`:Web层,负责处理HTTP请求和响应,可能包含Spring MVC控制器。 创建这个多模块项目的步骤如下: 1. **创建父模块**:...

    new project3

    从描述来看,这次更新主要集中在领域(domain)的重新设计以及DAO(Data Access Object)和DAOImpl(DAO实现)层面。 在IT行业中,"domain"通常指的是业务领域,它代表了应用的核心逻辑和模型。重新设计domain意味...

    JavaEE项目:用户信息管理系统.pdf

    其中,src文件夹下包括dao、dao/impl、domain、service、service/impl、util和web等文件夹,每个文件夹都有其特定的功能和作用。 2. 数据库设计:本系统使用MySQL数据库存储数据,并使用JDBC连接数据库。数据库设计...

    domain-model-com-jpa

    标题中的"domain-model-com-jpa"表明这是一个关于领域模型(Domain Model)与Java持久层API(Java Persistence API,简称JPA)相结合的项目。在这个项目中,开发者使用了Hibernate,它是JPA的一个流行实现,来处理...

    Spring+Struts+ibatis讲解

    3. 数据访问层(DAO):DAO层负责与数据库进行通信,具体的SQL语句写在domain包中的实体映射.xml文件里,如ibatis的mapper文件。DAO层同样分为接口和实现类,分别在iface和impl包中。 4. domain包:包含数据库表对应...

    人事管理系统学校实战项目

    【标签】中的"domain"指的是领域模型,它是业务逻辑的抽象,包括实体类和值对象,如Employee类,用于表示员工信息。"DAO"(Data Access Object)层是数据库交互的接口,负责将业务层与数据库操作解耦。"servlet"是...

    jpa代码自动生成工具-springboot

    在给定的"codetool"压缩包中,很可能包含了一个这样的工具,它可以帮助我们自动生成domain(实体类)、dao(数据访问对象)、service(业务逻辑层)以及controller(控制器)等代码。这些代码通常遵循MVC(Model-...

    基于struts2 spring2.5 hibernate3的人事管理系统 源码完整包

    这个系统利用了贫血模型(Anemic Domain Model)来实现DAO层,旨在提供高效、稳定且易于维护的企业级解决方案。 首先,Struts2是一个强大的MVC(Model-View-Controller)框架,它负责处理HTTP请求,并将这些请求...

    mybatis-generator

    在描述中提到的"生成service,mapper,domain以及dao类",这些都是MBG的典型生成目标,它们构成了一个标准的Java Web应用程序的数据访问层。 1. **配置文件**:MyBatis Generator的运行基于XML配置文件,其中包含了...

    SpringMVC-03教案1

    创建了一个父工程`ssm_parent`,并拆分为四个子模块:`ssm_web`(Web层)、`ssm_service`(Service层)、`ssm_dao`(DAO层)以及`ssm_domain`(领域模型层)。每个子模块都有特定的打包方式,如`ssm_web`为war包,...

    网上图书商城-项目开发总结报告.pdf

    DAO层通过反射技术实现了通用性,确保所有Domain对象都能进行数据库操作。Service层则通过反射技术创建统一的Service类处理大部分通用业务,特殊业务则通过专门的Service类来完成。 在页面设计上,普通用户的首页...

    Hadoop+JavaWeb大数据分析可视化系统.docx

    JavaWeb模块设计主要包括Dao、Domain、Service、Utils等组件。Dao用于数据访问对象,Domain用于业务逻辑,Service用于服务层,Utils用于工具类。 前端模块设计 前端模块设计主要包括HTML、JavaScript、Echarts、...

Global site tag (gtag.js) - Google Analytics