java中 service层和DAO层的区别

介绍

DAO层

dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查

service 层

service层叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来,至于为什么service层要使用接口来定义有以下几点好处:

  1. 在java中接口是多继承的,而类是单继承的,如果你需要一个类实现多个service,你用接口可以实现,用类定义service就没那么灵活
  2. 要提供不同的数据库的服务时,我们只需要面对接口用不同的类实现即可,而不用重复地定义类
  3. 编程规范问题,接口化的编程为的就是将实现封装起来,然调用者只关心接口不关心实现,也就是“高内聚,低耦合”的思想。

几点说明

java web 中dao 层和service层都使用接口,是否是为使用接口而使用接口?

一个dao或者一个service都是一个接口,然后再一个类去实现,为什么不直接使用一个类呢?在入门级(单表)的SSM(Spring+SpringMVC+Mybatis)+maven代码里面,我们甚至可以看到dao和service的接口类中代码内容都是一样的,这个作何理解?
在这里插入图片描述
其中,表示层一般是采用 MVC 架构模式,业务层有事务脚本模式、领域模型模式等,持久层有数据映射器模式(Hibernate即是典型的)、入口模式(MyBatis、JDBC)。企业应用中最关键的显然是业务层。而对于初学者来说,事务脚本模式是最为简单,最容易掌握的。如果开发团队面向对象设计能力一般,而且业务逻辑相对简单,业务层一般都会采用事务脚本模式。

所谓事务脚本模式,就是将业务层的对象分为三类,按照下图的方式组织起来(下图是用EA画的UML类图,一个简单的学生管理的业务层设计)。

在这里插入图片描述
如上图所示,在事务脚本模式中,有三类对象。其中,Service类封装业务流程(或者说是界面上的业务流程),DAO类封装对持久层的访问,DTO类封装业务实体对象。各个对象之间的关系如上图所示,这就是所谓业务逻辑的组织方式。

为什么要用Service接口和DAO接口?

其实就是为了解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。举个例子,用DAO接口,那么持久层用Hibernate,还是用myBatis,还是 JDBC,随时可以替换,不用修改业务层Service类的代码。

其实因为入门级程序做东西分层次不是那么严格,涉及到的业务很少,举个最简单的例子,你做一个分页的功能,数据1000条,你20条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。

一个DAO单独对1个表进行操作。一个Service可以操作几个DAO。

构建业务层的模式:Service + DAO,即DAO中只做CRUD及类似的简单操作(称之为功能点,不包含业务逻辑),Service中通过调用一个或多个DAO中的功能点来组合成为业务逻辑.Service的数量应该由功能模块来决定。在这种模型中业务逻辑是放在Service中的,事务的边界也应该在Service中控制. 当然,直接在Service中控制事务会引入非业务逻辑的代码,幸好spring的AOP可以解决这个问题,这也是引入Spring的原因之一。如果说到缺点,就在于对某些对象的操作就是简单的CRUD,Service层显得累赘。

java web中的service,dao,po分别是什么意思和什么作用

Service:service层是在mcv三层模式中新添加一层,能够更加清晰的定义应用程序的边界,需要操作数据的时候,通过service层访问DAO层来实现。service层做的事情,不仅仅是调用DAO操作数据,还会包含了一定的业务逻辑。整个程序设计就变成了针对服务的设计。

DAO:Data Access Object是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。是MVC模式中Model层

PO:Persistent Object即持久对象,它们是由一组属性和属性的get和set方法组成。可以看成是与数据库中的表相映射的java对象
在这里插入图片描述
Dao主要做数据库的交互工作
Modle 是模型 存放你的实体类
Service 做相应的业务逻辑处理
Action是一个控制器
Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;Service是厨师,action送来的菜单上的菜全是ta做的;Dao是厨房的小工,和原材料(通过mybatis操作数据库)打交道的事情全是ta管。对象的调用流程:JSP—Action—Service—DAO—mybatis—数据库。

service层事物控制的理解

一般情况下,我们会把事务控制在service层。

例如我们的一个业务:删除A记录,插入B记录(需要在一个事务里进行),如果我们把这个业务逻辑写在了action层,我们再action层调用删除A的service,然后再调用插入B的service,如果说插入B失败了,那我们删除A这个操作将不能回滚,因为事务控制在了service层,这样写已不是一个事务。删除A操作的service已经完成,事务已经提交了,插入B的操作在另外的事务里运行。根据需要,业务逻辑尽量放在service层。通过配置spring事务控制的传播行为,在service层可以达到大部分的业务事务要求,而不需另加一层。spring的事务有两种一种是声明式事务,一种是编程式事务。

action和dao层,会使用一些框架技术。比如action层可能选择有springmvc、struts等,dao层有hibernate、mybatis等选择,所以action的dao有可能根据情况变化,而service层关注业务逻辑,业务代码都是自己完成的,代码对自己是透明的。

我们更应该把与业务相关的代码移至service层控制事务。这主要发生在我们把整个业务逻辑放在了service的一个方法,而这个方法以及调用的方法的事务配置为required(或其他),但业务的部分操作需要在不同的事务中进行,我们不想写另外的方法,也不想去更改事务配置,所以引入support层(或许你说可以把这种逻辑向action层移动,在action层处理,但记住我们的前提,action的框架是会变的,我们想尽量做到更改action层时,更简单。而且从分工来说,action层应该只关注视图逻辑,个人自扫门前雪,休管他人瓦上霜)。support层当然不是只为处理这种事务问题的,我把它定义为业务处理时需要的一些辅助层,可以协助处理业务,比如刚才说的事务问题,还有可以提供工具类支持等。

对于dao层,应该只关注数据库连接执行结果封装这些事。

  • 18
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: JavaServiceDAOJava Web开发常见的两个级。Service主要负责业务逻辑的处理,而DAO则负责与数据库的交互。 Service通常包含业务逻辑的实现,例如数据的处理、验证、转换、计算等。它是整个应用程序的核心,负责协调各个模块之间的交互,确保业务逻辑的正确性和完整性。 DAO则负责与数据库的交互,包括数据的读取、写入、更新和删除等操作。它通常包含了数据库连接、SQL语句的执行和结果集的处理等功能,是实现数据持久化的关键。 在实际开发ServiceDAO通常是分离的,它们之间通过接口进行交互,以实现松耦合的设计。这种设计模式可以提高代码的可维护性和可扩展性,同时也方便进行单元测试和集成测试。 ### 回答2: JavaServiceDAO是非常重要的两个级,它们的任务是分离业务逻辑和持久化Service负责处理业务逻辑,而DAO负责与数据库进行交互,从而完成数据的持久化。 在下面的回答,我将详细介绍这两个级的角色以及它们的相互作用。 首先,DAO是数据持久化的核心。它的主要任务是与数据库进行交互,提供一系列的CRUD操作,以便将数据存储到数据库DAO通常与一个实体对象相关,提供查询,增加,更新和删除等数据访问方法。此外,DAO的方法通常是原子性的,即在执行操作期间不会出现异常,保证操作的完整性和可靠性。 而Service则更多地关注业务逻辑的实现,它主要负责完成业务需求的提供,减轻Controller的工作量。 Service由一个或多个方法组成,这些方法把DAO提取的数据进行预处理,进行业务逻辑的计算,例如收集数据,验证和校验数据,进行业务的计算,以及与DAO交互来完成相应的业务需求。 ServiceDAO不是孤立的,它们通过标准的接口进行了互动,能够共同实现实现业务需求。无论是Service还是DAO,都需要一个接口来定义提供的方法和参数类型。Service将持久化提供的方法进行封装,让Controller能够更容易的进行调用,并且提供更好的可重用性。而DAO提供的数据操作方法可以在Service进行集成和配置,让开发人员更有效地使用代码。 在集成业务逻辑和底数据访问时,这两个级互相支持。Service能够通过调用DAO获取数据,并将这些数据传递给业务模型进行预处理。在业务处理完成之后,需要将数据以持久化的形式存储到数据库,这时Service将使用DAO提供的方法来完成数据持久化,并将数据返回到相应的Controller进行输出。 综上所述,使用ServiceDAO能够分离业务逻辑和持久化,降低了代码重用的难度和学习成本,同时也避免了潜在的安全漏洞,提高了代码的可维护性和扩展性。在实际的应用开发过程,详细理解ServiceDAO的角色和位置,能够帮助我们更好的完成业务需求。 ### 回答3: JavaServiceDAO是分开发比较重要的两个次。 Service(业务逻辑)是整个系统的核心,它主要负责系统的业务逻辑,是业务逻辑的统一入口,将不同的DAO的数据进行组合,完成各种业务需求。业务逻辑对外提供的接口都应该是对外的业务,而不是单纯的数据操作。Service应该涵盖所有的业务规则和操作,封装了所有的复杂业务操作,使得控制流变得更加清晰、简单。 DAO(数据访问)是单一的数据操作接口,用于向数据库提供访问操作,封装了对数据库访问的细节,隐藏了数据存储的细节,使得Service的业务逻辑实现更加高效和简单。DAO提供了基本的CRUD(Create,Retrieve,Update,Delete)等基本数据访问操作,以及高级查询操作。DAO在解决了数据持久性问题的同时,也简化了数据库操作,提高了应用的可维护性和可扩展性。 ServiceDAO的关系是协作关系,其Service调用DAO,获取数据并处理,完成业务逻辑,最终把结果返回给客户端或其他调用者。DAO仅负责数据的访问,没有任何业务逻辑,而业务逻辑通过调用DAO的api来访问真正的数据源。ServiceDAO的分离,使得系统的各个次之间耦合度降低,便于修改和维护。 总之,使用ServiceDAO分离的编程方式,可以大大提高程序的可扩展性、可读性和可移植性。不同的业务功能应该放在不同的Service,并尽量避免Service类与DAO类之间的耦合。通过这样的分开发模式,可以帮助我们更加有效地管理整个应用程序,确保代码易于维护、可读性高、扩展性好。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值