草庐IT

初步对SSM框架中Dao层,Mapper层,service等层的理解

大司空° 2023-05-25 原文

    大家好啊,我是司空,最近在工作闲暇之余正在学springBoot,学到了关于mybatis的配置,里面涉及到几个不同层之间的使用让我有点摸不着头脑,没法,公司用的还是十年前的老框架,对于现在这些框架真没啥了解,不过MVC机制是没有变了,我也就结合我所学的内容和工作中的实际经验,谈一谈我对这几个层之间的了解吧。

基本了解

话不多说先上图

上图用的是我整理思路的时的草图,不具备专业性,大家别当真了哈,看看思路就好

dao层:用于定义操作数据库的接口方法,需要怎么调数据库就定义什么方法在这


mapper层:用于直接对数据库进行操作,sql语句就写这


service层:用于定义业务实现的接口方法,需要实现什么业务就定义什么方法在这


serviceImpl层:用于实现业务接口,可以操作管理dao层获取想要的数据


其他几个层:如controller,view,model,entity就简单过一过,分别负责数据的处理,展示,存储和封装。就不详细说了,我新学的主要是上面四个。

一些思考

根据上图我们知道,其实对于实现一个功能来说,只需要model,view,controller层就行了,那为啥还要在model到controller之间插入dao层和service层呢? 让我们带着这个问题,去看一下使用ssm框架实现一个view渲染的现实路径映射吧。

上图用的是我整理思路的时的草图,不具备专业性,大家别当真了哈,看看大体路径就好

可以看到啊,view层和controller层,controller层和service层,serivce层和dao层,都是多对多的关系。而service层和serviceImpl层,dao层和mapper层,mapper层和model层则是一对一的关系。

问题就出在这对应关系上!

试想一下,这只是一个view,就可能调用多个controller去获取数据,那两个view呢,一堆view呢。如果绕开service层和dao层以及mapper层,直接让controller层与model层进行交互,那很明显会出现一个问题,代码的大量重复以及耦合性强。如view1需要model1的userId,view2也需要,倘若绕开三层直接让controller层与model层进行交互,那么view1需要与model1建立一次连接,取一次userId。view2也需要与model1建立一次连接取一次userId,这是很蠢的行为。

一个方法,如果需要写三次以上,就应该封装起来,更别提调数据库这种如此频繁的行为。再说,如果数据库表遭到更改,难道你去每个controller里面改一次sql语句吗?

这就引出了我们第一个问题的答案:为啥还要在model到controller之间插入dao层和service层? 目的就是为了解耦,提高代码的开发效率。这也就是刚才我们提到的多对多关系的由来。

细心的朋友可能发现了,刚才我不仅说到了多对多的关系,还存在着一对一的关系。那么这个一对一的关系又是为了什么呢?

实际上,如果我们把service层与dao层合起来,在面对一些小型业务量的场景时,是完全没有问题的。起初我也搞不懂,为啥要用service的接口方法调用另外一个接口的方法去实现。可当业务量上去后,才发现这是一个多么明智的选择。

我认为建立service层和dao层最直接的好处就是单一职责化,这也是SOLID原则中的单一职责原则(Single Responsiblity Principle),非常经典的体现,service只用考虑业务如何实现,不考虑数据如何获取。dao层和mapper只用考虑数据如何获取,不用考虑数据要被拿去干什么。在多人协作开发与业务高复杂度场景中这种思想十分好用。

一些疑问:

看见网上一些博客,都说dao层一般是对应着某个表。我个人并不认同,一是表太多创建太多接口类难以管理。二是如果遇到那些多表联查的场景时,该把这些接口方法放到哪个类里面呢?

我认为较好的就是将dao层接口类与库相对应,一个库对应一个dao层接口类,然后把一些比较重要的表或者几张表单独建立dao层接口类,如用户信息,安全登录表等等。可以在方便管理的情况下又合理地保护某些重要数据。所有有人知道为什么dao层接口类要与表相对应嘛?有的话请在评论区告诉我哦。

以上就是我对这几个层的一些浅薄理解,如果有错误请大家多多指正,我们共同学习,共同进步。peace&love❥(^_-)

有关初步对SSM框架中Dao层,Mapper层,service等层的理解的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  4. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  5. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  6. ruby-on-rails - 将 Amazon Simple Notification service SNS 与 ruby​​ 结合使用 - 2

    很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。我需要从基于ruby​​的应用程序使用AmazonSimpleNotificationService,但不知道从哪里开始。您对从哪里开始有什么建议吗?

  7. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  8. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  9. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  10. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

随机推荐