S2/JAVA/09-数据访问层

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S2/JAVA/09-数据访问层相关的知识,希望对你有一定的参考价值。

持久化:是将程序中的数据在瞬时状态和持久状态间转换的机制。主要持久化操作包括保存、删除、修改、读取和查找等。

 

DAO(DataAccessObjects,数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。

在面向对象设计过程中,有一些套路用于解决特定问题,称为模式。DAO模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离,对上层提供面向对象的数据访问接口。

从以上DAO模式使用可以看出,DAO模式的优势在于他实现了两次隔离。

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

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

 

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

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

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

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

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

 

分层开发的优势:

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

2、便于分工协作,从而提高效率。一旦定义好各个层次之间的接口,每个开发人员的任务得到了确认,不同层次的开发人员就可以各司其职、齐头并进,从而大大加快开发进度。

3、便于代码复用。每个模块一旦定义好统一的对外接口,就可以被各个模块调用,而不用对相同的功能进行重复开发。例如,不同的业务逻辑模块如果需要对相同数据库进行操作,无需各自开发相应的DAO模块,复用即可。

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

 

分层的特点:

1、每一层都有自己的职责。硬件负责存储、运算、通信等;而操作系统负责管理硬件;应用软件工作在操作系统上,实现业务功能,满足用户需要。

2、上一层不用关心下一层的实现细节,上一层通过下一层提供的对外接口来使用其功能。应用软件不用知道操作系统是如何管理硬件的,而操作系统也无需关心硬件的具体生产流程。

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

 

分层的原则:

1、封装性原则:简单而言,就是每个层次向外提供公开的统一接口,而隐藏内部的功能实现细节,其他层次不能也没有必要了解其内部细节。

2、顺序访问原则:下一层为上一层提供服务,而不使用上一层提供的服务。业务逻辑层可以访问数据访问层的功能,而数据访问层不能访问业务逻辑层功能。

 

注意:提供给业务逻辑层的接口不应该包含数据访问细节。例如,不能直接返回ResultSet对象,而要在DAO内部进行关系表到对象的转换,以集合对象返回。对于连接字符串、SQL语句、文件路径等直接在数据访问层提供,而不要通过业务逻辑层传入。

 

实体类的特征:

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

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

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

4、实体类最好实现java.io.Serializable接口,就应该定义属性serialVersionUID,解决不同版本之间的序列化问题。例如:

private static final long serialVersionUID=2070056025956126480L;

以上是关于S2/JAVA/09-数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

将数据访问逻辑从业务层移至数据访问层

数据访问层设计

业务逻辑层应该访问数据库/数据访问层吗?

Spring数据访问和数据访问层与业务或服务层之间的交互

数据访问层的目的是啥? [关闭]

“数据服务层”和“数据访问层”有啥区别?