练习中出现 DAO层 、 Service层 、 Controler层 、entity 层、utils 层、mapper 层
想知道几个之间的关系是如何?
分层的目的是:高内聚、低耦合
DAO层(接口)
也叫数据访问层,做的是数据持久层的工作,负责与数据库进行联络的任务都封装于此。在 Spring中的配置文件里可有定义此接口的实现类。然后在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,凸显了结构的清晰,DAO层的数据源配置,以及和数据库有关的参数都在 Spring 的配置文件中进行配置。
DAO层的设计是设计DAO的接口。它只负责对数据进行访问,不会去管其他的业务逻辑。只干活,不知道为什么干活。可具体到某一张表进行增删改查,一定是与某张表一一对应。封装了增删改查基本操作。建议只增删改查,原子操作。
DAO 层为上层 Service 层提供接口。如果是查询,返回对象;如果是增删改,可以只返回boolean 表明失败还是成功即可。
mapper层=dao层,现在用mybatis逆向工程生成的mapper层,其实就是dao层。对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者。
(多说一句,数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作,比如数据通过hibernate插入到数据库中。)
Service层
业务逻辑层,向上层 Controller 层提供接口,并且使用 DAO 层提供的接口。同样首先设计接口,再设计其实现的类。接着在 Spring 的配置文件中配置其实现的关联。这样就可以在调用 Service 接口来进行业务处理。Service 层业务实现,具体要调用已定义的 DAO 层接口。如果客户业务有变动,那么我们只需要在 Service 层进行一些变动就可以,利用了业务逻辑独立性和重复利用性。
粗略理解对一个或者多个 DAO 进行再次封装,封装成一个服务,这里不是原子操作,需要事务控制。
PS:Service 是将 dao 层的增删改查基本操作调用过来,封装到 service 类中,集成一个服务。
存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。
在实际开发中的Service层可能被处理为实体Service层,而不是接口,业务逻辑直接写在Service(Class,不是Interface)层中,Controller直接调用Service,Service调用Mapper。
当然了,Service之间也是可以互相调用! service的 impl 是把 mapper 和 service 进行整合的文件。
Controller 层
Controller 层负责具体业务模块-流程的控制。在此层里需要调用 Service 层来控制业务流程。控制的配置也同样在 Spring 的配置文件里进行。针对具体的业务流程,会有不同的控制器。我们具体设计时,可以将流程进行抽象归纳,设计出可以重复利用的子单元,使得程序结构清晰。
Controller 层管理用户的操作,负责请求转发。用户界面传过来的请求。通过前端传过来的参数进行业务操作,调用对应的服务(Service),再返回一个指定的路径或者数据表给页面,完成用户请求的处理。
控制业务逻辑不是业务逻辑的实现,而仅仅是一个大的模块,你看到之后,知道它实现了这个业务逻辑,但是怎么实现的,不需要关心,仅仅需要调用service层里的一个方法即可,这样使controller层看起来更加清晰。
三个层之间的小结:
总结这三者,通过例子来解释:
Controller像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;
Service是厨师,action送来的菜单上的菜全是ta做的;
Dao是厨房的小工,和原材料打交道的事情全是ta管。
相互关系是,小工(dao)的工作是要满足厨师(service)的要求,厨师(Service)要满足服务员(Controller)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。
DAO面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出DAO层,然后根据具体的业务逻辑进一步封装DAO层成一个Service层,对外提供成一个服务。
SpringMVC ——model、view、Controller
SSM是sping+springMVC+mybatis集成的框架。
view:视图。这个很容易理解,其实view层就是用户用户可以看到的东西。后台怎么处理不关心,只关心怎么样想用户展示信息。
model层=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。