深入探讨数据库DAO持久层的设计原理与实现 (数据库dao持久层设计)

当我们开发一个应用程序时,业务逻辑和数据持久化是两个非常重要的部分。在进行数据持久化时,我们通常会选择一个数据库去存储我们的数据。而在与数据库进行交互时,我们则会使用层次结构不同的技术。其中一种常用的技术是DAO(Data Access Object),它是一种轻量级的数据访问模式。

本文将会深入探讨DAO的设计原理与实现,并介绍如何正确地应用DAO模式来增强我们程序的可维护性、扩展性和可重用性。

1. DAO模式的概述

DAO模式是一种将数据持久化的方法从业务逻辑中分离出来的设计模式。它的核心思想是将数据访问和数据操作分离,将数据持久化层封装到单独的DAO中,实现了业务逻辑层与数据持久化层的解耦,使应用程序更加易于维护和扩展。

2. DAO模式的设计原则

在设计DAO模式时,我们需要遵循以下原则:

2.1 单一职责原则

每个DAO应该只包含一种实体的操作,并且不应包含其他实体的操作。例如,一个名为UserDAO的DAO应该只包含用户实体的操作。

2.2 开放封闭原则

DAO应该支持未来的扩展,但不会修改现有代码。

2.3 接口隔离原则

DAO应该只实现必需的接口,并且不应该实现不必要的接口。

2.4 依赖倒置原则

高级模块应该依赖于抽象而不是实现。换句话说,DAO的实现应该来自于抽象类或接口,而不是具体的实现。

3. DAO模式的实现

DAO模式的核心是将数据访问和数据操作分离。在实现DAO模式时,我们需要创建至少三个组件:实体类,DAO接口和DAO实现类。

3.1 实体类

实体类是指表示数据模型的类,通常包含了实体的各种字段,以及用于访问和操作这些字段的方法。例如,我们可以创建一个名为User的实体类,它包含了用户实体的所有字段及用于获取和设置这些字段的方法。

“`java

public class User {

private int id;

private String name;

private int age;

// Getters and setters

}

“`

3.2 DAO接口

DAO接口是指用于定义DAO操作的接口,通常包含用于添加、删除、更新和查找实体的方法。例如,我们可以创建一个名为UserDAO的接口,它包含了用于操作用户实体的所有方法。

“`java

public interface UserDAO {

void addUser(User user);

void deleteUser(int id);

void updateUser(User user);

User getUser(int id);

}

“`

3.3 DAO实现类

DAO实现类是指用于执行具体DAO操作的类,通常包含了数据库操作的代码。例如,我们可以创建一个名为UserDAOImpl的实现类,它包含了用于操作用户实体的所有代码。

“`java

public class UserDAOImpl implements UserDAO {

@Override

public void addUser(User user) {

// Insert user into the database

}

@Override

public void deleteUser(int id) {

// Delete user from the database

}

@Override

public void updateUser(User user) {

// Update user in the database

}

@Override

public User getUser(int id) {

// Get user from the database

return null;

}

}

“`

4. DAO模式的优缺点

DAO模式提供了很多优点,包括代码的可维护性、可扩展性和可重用性等。

4.1 可维护性

DAO模式使应用程序的维护更加容易。由于数据持久化层和业务逻辑层分离,所以我们可以更加轻松地维护应用程序,并在需要时更改数据持久化层的实现。

4.2 可扩展性

DAO模式支持未来的扩展,而不需要修改现有代码。如果我们需要添加新的功能,我们只需要添加新的DAO方法,而不需要修改现有的代码。

4.3 可重用性

DAO模式使得数据访问逻辑的重用更加容易。由于DAO模式中的数据访问逻辑是抽象的,因此我们可以轻松地重用它,而不需要重写现有的代码。

然而,DAO模式也存在一些缺点。最主要的问题就是它增加了代码的复杂度。由于我们需要创建多个类来实现DAO模式,因此代码的组织和维护是一项挑战。

5. DAO模式的应用场景

DAO模式通常适用于需要将数据访问逻辑从业务逻辑中分离出来的应用程序。例如,当我们需要封装数据源时,使用DAO模式是一种比较好的选择。

除此之外,DAO模式还适用于需要增强代码可维护性、扩展性和可重用性的应用程序。当我们需要在应用程序中添加新的功能时,我们可以轻松地添加新的DAO方法,以支持这些功能。

6. 结论

DAO模式是一种使用广泛的轻量级数据访问模式,可以将数据持久化层封装到单独的DAO中,实现了业务逻辑层与数据持久化层的解耦。在设计和实现DAO模式时,我们需要遵循单一职责原则、开放封闭原则、接口隔离原则以及依赖倒置原则等原则。DAO模式具有可维护性、可扩展性和可重用性等优点,但它也存在代码复杂度高的问题。DAO模式通常适用于需要封装数据源、增强代码可维护性、可扩展性和可重用性的应用程序。

相关问题拓展阅读:

关于javabean和DAO模式

JavaBean是数据的承载体,负责把一组有逻辑的数据从一个层传到另一个层。

  DAO的出现是对持久层的变动的一个解决方案。

  对于不同的持久介质(RDBMS、XML、ODBMS等)、不同的提供厂商(Oracle、Mysql等)提供的产品,进行持久化操作时,对于业务逻辑层应该是统一的,于是DAO模式就出现了。

  对于同一个业务操作,例如添加一个用户,请求到达业务层,只需调用DAO层的addUser()即可。而到底是怎么添加的、以及添加到哪里,是业务层不用关心的,也是不要关心的。

  于是,持久层将利用业务层传递来的请求数据,即封装了要添加的用户信息JavaBean,添加到持久层:Oracle就要取序列,Mysql会自动增长,XML就要手动控制了。这些实现细节对业务逻辑层是一样的效果。

  但是DAO模式中也会有一些数据承载体,不过它们承载的不是业务数据,而是持久化操作的相关对象,例如DAO对象,DAO工厂,连接对象等。表面上看,这些也承载数据,但它实际是包含了内在的逻辑和操作。例如连接对象的打开和关闭,事务的回滚和提交等。

  所以,严格意义上来说,它们不是纯粹的JavaBean。纯粹的JavaBean是只包含属性和这些属性对应的getter和setter。

JavaBean就是把简单的POJO.

但是DAO是封状操作数据库等细节的.

spring mvc里面,为什么要单独出来一个service层调用dao再传给controller啊? 这样设计有什么好处?

有些朋友可能会问为什么要分层呢?我本来可以在一个地方写完的东西,非要散落在各个层中,都在一起不是挺好的吗,而且开发效率也比较高啊~

跳来跳去的我脑子都晕啦。。。

这就是为什么有人会把所有的东西都扔在一个层里,比如controller层。。。

其实我们可以在jsp上把所有的逻辑以及数据库操作,数据展示全部写在一起,耦合在一起,这样开发起来貌似更快,

但是维护性非常差,有朝一日想改一个小地方,牵一发而动全一身,隐患很高,无法快速定位问题察乎宽。

因此我们需要分层。

分层了之后,你理论上改了持久层的东西,逻辑层是不用变动的。

每个Dao类是跟每个表走,Dao的每个方法里就一个个的简单sql,不包含任何业务逻辑,可以被不同的service复用和调用。

经过抽象后基本上都是通用的,因而我们在定义DAO层的时候可以将相关的方法定义完毕,

这样的好处是在对Service进行扩展的时候不需要再对DAO层进行修改,提高了程序的可扩展性。

提高了程序的可扩展性。具体什么时候做这些操作,怎么做这些操作都由Service来处理。

(就像郭德纲的相声里的一句话:“行了,你甭管了”)

而Service则不是,一个Service里可以会调用多个不同的dao,完成特定的业务逻辑,事务控制,

封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性

同时,一个Service的方法也有可能被多个Controller的方法来调用。

逻辑出问题就在Service找问题,数据库,sql有问题就在Dao层找问题,

参数解析错误,跳转错误,就在Controller上找问题。

这样快速定位问题,互不干扰。

分层架构(这里会延伸到更广阔的架构):

回头项目玩大了,怎么办?拆!!!

具体可以搜一下:maven分模块开发,怎么玩代码依赖,怎么玩微服务,怎么玩SOA,怎么玩RPC,怎么玩dubbo。

web项目发展有几个阶段啊

之一个阶段(单一应用架构):

所有代码都耦合在一个项目里,放在一台服务器上,这种all in one的方式是有好处的。

创业初期,不用什么架构,走敏捷开发,最快速的实现需求才是王道。

你甭管我有多烂,我至少能跑起来,我至少能在外网上让你访问,让你使用。

当然了,初期的访问量很少,节省部署和运维成本才是王道呀。

听阿里的讲座,说淘宝的前期的版本用的就是一台PC机作为服务器,所有的功能耦合在一个项目里,

每次往生产环境上发版本,要上传一个600mb的包,呵呵。

第二个阶段(垂直应用架构):

哎哟,不错哦。自己的儿子被越来越多的人访问,访问量激增,一台服务器扛不住了,

没事,我们可以玩负载均衡,玩集群。

但是!这种性能加速度其实会变得越来越小,因为你的项目是耦合在一起的。

这时,我们需要拆败亮分项目,这里又有2个维度,按层拆,按模块拆。

将拆好的不同项目分别部署在不同的服务器上,并且再分不同的小集群。

第三个阶段(分布式服务架构):

唉呀妈呀,访问量陡增,到这步你创业应该算成功了,开始烧投资人的钱了吧。

经过上面拆成了越来越多的模块,模块与模块交互越来越多,怎么办?

这个时候我们需要把核心的业务抽出来,作为独立的服务,慢慢发展成稳定的服务中心,

用来提升业务复用和整合。

就像阿里的大牛说过,没有淘宝的积累,天猫能那么快的出来吗?

这个时候,你的缓存,数据库,消息队列等服务都应该是分布式的。

第四个阶段(流动计算架构)

哎呀妈呀,访问量又上了一个台阶,翻了好几百倍吖,肿么办?

这个时候服务越来越多,一些容量和资源的浪费问题凸显出来,

这时我们需要一个调度中心来基于访问压力动态的管理集群容量,

提高利用率。

第五顷庆个阶段(云计算架构)

抱歉,作者正在学习分布式架构中,未完待续。

首先我们先知道spring的项目分层: 

按照MVC的设计理念来讲,由service服务层调用持久层dao,在由controller调用service,这符合MVC的分层结构也坦正符合我们的编程习惯。

dao一般是做封装,service做业务,controller校验数据

要是controller直接调用dao的话,controller直接拿到数据这是游信模不安全的,而且平常的一些业务逻辑处理不好处理,因为业务需求是实时改变的,把业务写在dao里还要全部更改业务信息,这样不仅不会节约成本还增加耦合,代码复用性也不高后期代码维护也困难。建议还是遵循MVC分层结构神缓开发,尽管是少量数据也不建议直接调用dao。关于好处可以上别人博客借阅:

网页链接

在controller调dao其实也没问题,你还是没搞明白为什么要分层,在规范上来说,dao层只处理与数据库的交互,说白了就是怎么访问数据信歼库,比如查询返回list,map.update,delete之类的,总体来说dao层几乎都是固定化的东西,整个框架可以只用一个dao接口和实现类(前提是你知道泛型),整个service层都调用同一个dao,因为访问数据库就那么几个需求.

service层又叫做业务层,本来组织sql之类的都是在这层写,但是很多人会写在dao层,其实是不对的,但是也没人会在意,而且直接写在dao层会看起来简单,实则从长久看会麻烦,但是谁会在意呢,这只是个注重效率的时代,service层的目的是重用,就比如你要分页查询,就会分为3个方法,查list,查数量,和一个把这两个组装的方法,这样分页的时候直接调用组装这个方法就可以了,其他地方要查list或者数量就可以调另外的方法,要是把这个都现在一个dao中那就只专用于查询这个分页了,所以从长久来说孙拍在service层写sql是很有必要的(但是时间有时候不能让你思考那么多),再有一个就是service是受数据库事务控制的,就比如你一个请求要改变两个表的数据,那在service层调用两次dao就可以了,如果在controller调用两次service那之一次成功第二次失败了是不是还要回滚之一次的改变?

controller 主要是处理一些不想关业务的逻辑,就比如你人员表中存的人员所属部门的id,你现在不可能把id直接显示到页面上,但是又想少些sql和少的代码,那你就可以差分页之后,再在controller中调用查部门的service,这样把分页查到的list遍历一下就可以把按id把部门去,这样的好处是你则坦羡人员的查询service中的sql只关心人员表的数据,不用各种关联其它表(但是有时候还是需要关联的).

就说这么多吧,纯手打,之一次打这么多东西….

Controller层:负责具体业搏塌务模块流程的控制,即调用Service层的接口来控制业务流程。负责url映射(action)。

Dao层:负责数据持久化,与数据库进行联络的任务都封装在其中,Dao层的数据源以及相关的数据库连接参数都在Spring配置文件中进行配置。Dao接口中的方法都大同小异,因为对数据库的基本操作类似:insert、delete、update,select。    在Dao层定义的一些方法,在Service层并没有被使用的情况:Dao层的操作经过抽象后基本都是通用的,在Dao层完成相关方法的定义,有利于支持后期Service层的扩展。(与相应的mapper对应)

Entity层:java对象,与数据库表一一对应,是其对应的实现类。即一个Entity就是对应表中的一条记录。

Service层:建立在DAO层之上,Controller层之下。调用Dao层的接口,为Controller层提供接口。负责业务模块的逻辑应用设计,首先设计接口,再设计其实现的类。

View层:表示层,负责前端jsp页面表示。

原因:

面向接口编程。表示层调用控配唯制层,控制基卖圆层调用业务层,业务层调用数据访问层。

Dao层设计与设计的数据库表,和实现类(对应的Entity或者JavaBean)一一对应。

View层与Controller层结合紧密,需要二者结合协同开发。Service层、Dao层和其他层次耦合很低,完全可以单独开发。

spring mvc 里面的 mvc 是有其意义的。

mvc全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

可能你注意到了,这里面并没有service,因为mvc概念也是从桌面软件开发中移植过来的,所以在应用到网络应用开发中,进行了一些改变,service层就是新演变出来的, service负责业务逻辑处理,如果滚碰慎没有service层,那要把业务代码放到controller中吵正,一些公共的方法就无法实现共享,总的来说,service的出现就是为了代码重大敬用。

至于dao是属于模型层的,也是一样受用于分层的概念,分层的优势有两个:解耦代码、实现重用。

MVC只是一种设计规范,不是硬性的,比如:如果项目很小,那可以没有service。

关于数据库dao持久层设计的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入探讨数据库DAO持久层的设计原理与实现 (数据库dao持久层设计)