数据访问层

DAO 模式:讲解软件开发中的分层开发思想和技术,随着软件规模的扩大和业务的复杂,将一个软件分成多个层次进行开发,化大为小,分而治之,是缩短软件开发时间,提高软件开发效率的一种有效方法,也是目前软件开发一直使用的方法。

数据持久化:很多程序都有保存数据、读取数据的需要。程序运行时,保存在内存中的数据时瞬时的,关机之后将丢失。为了持久保存数据,需要将数据保存到磁盘中,比如保存到数据库或文件中。这样,程序启动时可以从磁盘读取数据,数据发生改变或程序关闭时,保存数据到磁盘,实现了数据的持久保存。

这里涉及到一个术语:持久化。持久化是将程序中的数据在瞬时状态和持久状态间转换的 机制。JDBC 就是一种持久化机制,将程序直接保存成文本文件也是持久化机制的一种实 现,但我们常用的是将数据保存到数据库中。

DAO,就是 Data Access Object(数据存取对象),位于业务逻辑和持久化数据之间 实现对持久化数据的访问。 在面向对象设计过程中,有一些“套路”用于解决特定问题,称为模式。DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离,对上层提供面向对 象的数据访问接口。

DAO 模式的好处就在于它实现了两次隔离。

? 隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用 DAO 方法即可,完全感 觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符 合单一职能原则,降低了耦合性,提高了可复用性。

? 隔离了不同数据库实现,采用面向接口编程,如果底层数据库变化,例如由 Oracle 变为 SQL Server,只要增加 DAO 接口的新实现类即可,原有 Oracle 实现不用修 改,这符合“开-闭”原则,降低了代码的耦合性,提高了代码扩展性和系统的可移 植性。

一个典型的 DAO 模式主要由以下几部分组成。

? DAO 接口:把对数据库的所有操作定义成一个个抽象方法,可以提供多种实现。

? DAO 实现类:针对不同数据库给出 DAO 接口定义方法的具体实现。

? 实体类:用于存放与传输对象数据。

? 数据库连接和关闭工具类:避免了数据库连接和关闭代码的重复使用,方便修改。

分层开发的优势

采用 DAO 模式后,数据访问代码被提取出来,由 DAO 接口和实现类来实现功能,形成了 数据访问层,该层代码一般放在 dao 包下,其他层不再考虑繁琐的数据访问操作,层层 之间通过实体类来传输数据。

? 每一层专注于自己功能的实现,便于提高质量。不同层次的关注点是不同的,数据访问层主要是数据库访问,业务逻辑层的重点是业务逻辑,前段表示层专注于页面的布 局和美观。根据不同层次需要由最适合的技术人员来实现,从而提高开发质量。

? 便于分工协作,从而提高效率。一旦定义好各个层次之间的接口,每个开发人员的任 务得到了确认,不同层次的开发人员就可以各司其职、齐头并进,进而大大加快开发进度。 ? 便于代码复用。每个模块一旦定义好统一的对开接口,就可以被各个模块调用,而不 用对相同的功能进行重复开发。比如不同的业务逻辑模块如果需要对相同数据库表进 行操作,无需各自开发相应的 DAO 模块,复用即可。

? 便于程序扩展。比如 DAO 模式中采用面向接口编程,底层数据库发生变化,可以通过 增加接口的新实现来解决,实现无损替换,而不是修改原有代码,便于程序扩展。

分层的原则

? 每一层都要自己的职责。

? 上一层不用关心下一层的实现细节,上一层通过下一层提供的对外接口来使用其功 能。

? 上一层调用下一层的功能,下一层不能调用上一层功能。下一层为上一层提供服务, 而不使用上一层提供的服务。

与此类似,在分层开发中,分层也应检查类似原则。 ? 封装性原则:简单而言,就是每个层次向外提供公开的统一接口,而隐藏内部的功能 实现细节,其他层次不能也没有必要了解其内部细节。

? 顺序访问原则:下一层为上一层提供服务,而不使用上层提供的服务。业务逻辑层可 以访问数据访问层的功能,而数据访问层不能访问业务逻辑层功能。不是相互访问, 而是顺序访问。 每一层都有自己的职责。对于数据访问层而言,它的职责就是执行数据访问操作。为了提 高封装性,应注意提供给业务逻辑层的接口不应该包含数据访问细节。

使用实体类传递数据

在分层结构中,不同层之间通过实体类来传输数据。把相关信息使用实体类封装后,在程序中把实体类作为方法的输入参数或返回结果, 实现数据传递,非常方便。关于实体类,主要有以下特征。

? 实体类的属性一般使用 private 修饰。

?根据业务需要和封装性要求对实体类的属性提供 getter/setter 方法,负责属性的 读取和赋值,一般使用 public 修饰。

? 对实体类提供无参构造方法,根据业务需要提供相应的有参构造方法。

? 实体类最好实现 java.io.Serializable,支持序列化机制,可以将该对象转换成 字节序列而保存在磁盘上或在网络上传输。

? 如果实体类实现了 java.io.Serializable,就应该定义属性 serialVersionUID,解决不同版本之间的序列化问题。例如: private static final long serialVersionUID=2070056025956126480L;

时间: 2024-10-21 05:55:56

数据访问层的相关文章

微软-创建数据访问层

简介 https://msdn.microsoft.com/zh-cn/cc964016 作为web 开发人员,我们的工作总是在和数据打交道.我们创建数据库来存储数据,编写代码来检索并修改数据,并创建Web 页面来收集和汇总数据.这是探讨在ASP.NET 2.0 中实现这些常用类型的技巧的系列教程中的首篇教程.我们从创建一个 软件架构 开始,包括使用Typed DataSet 的数据访问层(DAL) .实现自定义业务规则的业务逻辑层(BLL) 和共享同一页面布局的ASP.NET 页面组成的表示层

使用Ninject+Moq在单元测试中抽象数据访问层

一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑 二.步骤如下 2.1 定义数据访问接口和实现 public interface IDBAccess { List<string> GetList(string request); } public class DBAccessImp : IDBAccess { public List<string> Ge

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

数据访问层之Repository

数据访问层之Repository 接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的"伪仓储", 这个仓储只实现单表的CURD与Query,都是通过主键ID或拉姆达表达式进行操作的,返回的都是单表的实体或实体集合, 多表的在IQuery接口中再讲:虽然如此,但是如果与"活动记录"开发模式搭配的话,会非常合适,可以减少开发的时间 及出错几率,更符合开发人员的类型

项目架构开发:数据访问层之Query

接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操作,多表联查并没有实现 其实对于任何一个项目来说,多表联查都是比较麻烦的地方,因为项目的“读”操作,特别是多表的“读”,至少占据所有“读”的一半以上 然而至今,据我所知还没有哪一款ORM工具可以灵活处理多表联查:想要不写sql语句,又想性能高,还想用强类型的ling查询方法:这对于多表查询来说比较难

JavaEE使用三层架构(显示层、业务逻辑层、数据访问层)实现数据的增删改查

实例: 1.功能描述 实现一个简易新闻发布系统,包括查看.添加.修改和删除新闻等基本功能 2.具体要求 (1) 创建数据库 newssystem,创建表 news,要求如下: (2) 程序运行时,显示'发布新闻'页面(如图 1),输入相关内容,单击'提交'按钮,将新闻内容添加到数据库 (3) 单击图 1 中的'查看'按钮,显示'查看新闻'页面(如图 2),增加'修改'和'删除'链接 (4) 单击图 2 中的'update'链接,显示'修改新闻'页面(如图 3),修改后单击'修改'按钮确认,单击'

Spring数据访问层Dao案例

本文描述的是通过spring框架实现数据持久化操作,具体内容如下: 1,POJO类定义: 1 import java.io.Serializable; 2 import java.util.Date; 3 4 public class User implements Serializable{ 5 private int userId; 6 7 private String userName; 8 9 private String password; 10 11 private int cred

企业级应用框架(三)三层架构之数据访问层的改进以及测试DOM的发布

在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.net,EF,linq To Sql,这一点我们实现的不是很完美,仍有很大的改进空间,本文将加以改进. 在此之前我们来看一下我们最新的dom(PS:经过两天的赶工,我们的dom已经相对成熟,其中BLL层已经被我高度抽象化了,并且引进了业务上文文的概念:DAL层除了具体的技术实现尚为完成,其他方面已经相

【原创】打造基于Dapper的数据访问层

前言 辞职在家闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回DataTable.DataSet和强类型,同时支持不同类型数据库.目前成熟的ORM框架多不胜数,再写一个出来,并非想证明自己写的有多好,一来认为现有成熟的ORM框架并不能灵活适用于大型ERP项目,二来有感于工作多年有必要写下一些东西.虽然有种重复造轮子的感觉,但相信朋友们和我一样,享受造轮子的过程并把它当成一种乐趣,对吧. 调用示例

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using