转自:http://blog.sina.com.cn/s/blog_4adc4b090101kvek.html
首先解释面上意思,service是业务层,dao是数据访问层。
呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以后就会知道,业务才是工作中的重中之重。我们都知道,标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。
接下来说你感觉service的意义,其实因为你现在做东西分层次不是那么严格,在一个你们做东西业务本身也少,举个最简单的例子,你做一个分页的功能,数据1000条,你20条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。
再有不明白的追问,这是经验问题,呵呵,其实以后你就会懂。只是刚开始写的代码都是有个请求,我就去数据库取,业务几乎没有。
------------------------------------------------------------------------------
虽然每分,但还是把自己的理解给LZ说说。
怎么说呢,我不是理论帝。所以我讲讲自己的理解
比说你现在用的是SSH框架,做一个用户模块:
1、假设现在你做这个功能会用到user表和权限表,那么你前台的页面访问action,action再去调用用户模块service,用户模块service判断你是操作user表还是权限表,如果你操作的是user表则service的实现类就去调用userDAO。如果是操作的是权限表则调用权限的DAO
2、也就是说DAO一定是和数据库的每张表一一对应,而service则不是。明白的没?其实你一个项目一个service和一个DAO其实也一样可以操作数据库,只不过那要是表非常多,出问题了,那找起来多麻烦,而且太乱了
3、好处就是你的整个项目非常系统化,和数据库的表能一致,而且功能模块化,这样以后维护或者改错比较容易,性能也高一些
--------------------------------------------------------------------------
简单的说DAO层是跟数据库打交道的,service层是处理一些业务流程的,
至于你说的为什么要用service层封装,我认为:一般来说,某一个程序的有些业务流程需要连接数据库,有些不需要与数据库打交道而直接是一些业务处理,这样就需要我们整合起来到service中去,这样可以起到一个更好的开发与维护的作用,同时也是MVC设计模式中model层功能的体现
-------------------------------------------------------------------------------
初级DAO模式:
例如::写一个类 操作1张表 针对这张表的所有操作都以方法的形式写在这个类中 1个操作对应1个方法要求是外部通过调用这个类的方法达到操作某张表的目的时不需要写任何和数据库以及JDBC相关的代码,这个类的命名就是XXDAO
比如表叫做 t_goods 商品表那么操作它的DAO就叫GoodsDAO
高级DAO模式:
例如:即DAO工厂模式,多个XXDAO实现同一个接口或者继承同一个基类,编写一个工厂类通过工厂模式(简单工厂模式或利用反射动态加载均可)获得接口或基类对象,内部实际上封装返回的是具体的XXDAO类的对象。简单的说即是在1的基础上将创建具体的XXDAO对象的方式由new变为工厂模式实现
例如:UserDAO dao = DAOFactory.create(...);
dao.save()
dao.delete....
-------------------------------------------------------------------------
1.有一个dao接口,里面有平时的增删查该的方法
2.有一个具体的实体类
3.有一个dao的实现类,有对实体操作的方法,继承1的接口
4.如果有需要,还可以有一个工厂类,负责生产dao实现类
---------------------------------------------------------------------------
DAO层一般有接口和该接口的实现类! 接口用于规范实现类! 实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类DAO类!
-----------------------------------------------------------------------------
com.公司名.系统名.模块名
代码目录结构
Action : 负责页面逻辑,将调用service的结果返回到页面中
Service : 接口定义
---impl 接口的实现,负责业务逻辑
Domain 对应数据库表的pojo
Dao : 只负责连接数据库,从数据库中查询结果,包装成对象后返回
util :工具类
追问
我看着 他们的 DAO里面的接口都和service里面的接口都一模一样 这是为什么呢
何必多此一举 还有再问下 spring 在调用的时候经过哪几个步骤
回答
完全一样是因为业务简单,都是简单的增删改查。但是如果业务复杂一点,service层干的活就多了。举个简单一点的例子,附件上传,dao可能只把附件的路径啊,名称啊之类的存储到数据库中,但是真正的把文件上传的ftp还是要在service层写的。
你的第二个问题没看懂你要问啥。
------------------------------------------------------------------------------------------
action里是动作层,一般是控制层的代码,控制页面的跳转;Dao层负责数据库的对象的増删改查接口,里面的方法是抽象的;DAOImpl层则实现了Dao层中的抽象方法,供action调用,这样也从一定程度上对控制层和数据库层进行解耦
追问