APP下载

一种基于泛型DAO模式的数据持久化层模型

2013-09-17欧阳宏基张琳娜

微型电脑应用 2013年9期
关键词:子类数据源组件

欧阳宏基,张琳娜,葛 萌

0 引言

目前企业级Java EE应用中普遍采用分层的开发方式,这些分层自顶向下依次为表示层、控制层、业务逻辑层、数据持久化层和数据库层。分层的优势除了提高开发效率、层与层之间的松散耦合外,最重要的就是增强组件封装的能力,从而提高重用性、扩展性和可维护性。其中数据持久层的主要功能是为实体类提供访问数据存储设备的接口,开发中普遍采用了DAO设计模式。这样做的目的是为业务逻辑层提供一个访问数据源的统一接口并隐藏操作数据源的实现细节。DAO中基本都是对实体类进行数据源的增删改查(CRUD)操作,这些操作具有相似性。如果一个系统中存在着多个实体类,那么就会产生大量的重复代码并且有潜在的类型转换风险,不利于系统的维护。为了解决这个问题,将泛型机制引入到DAO模式中并结合模板模式,从而避免了大量的重复代码并且解决了强制类型转换所带来的风险。

1 DAO模式的工作原理

DAO(Data Access Object)模式是将业务逻辑从数据存取逻辑中分离出来,使得业务逻辑不会因为数据源的改变而改变,如图1所示:

图1 DAO模式

DAO模式包括四部分:业务对象、数据访问对象、值对象(实体类对象)和数据源。业务对象并不直接和数据源交互,而是通过DAO提供的接口获得值对象或者实体类对象,修改他们的值后通过DAO保存到数据源。某些情况下值对象中的属性是实体类对象属性的一个子集,通常会根据应用的具体情况而决定使用值对象还是实体类对象。业务逻辑仅仅通过面向对象的方法操作DAO,无需考虑数据源的具体类型、事务、并发等复杂问题[1]。

DAO模式完成了一个持久层的部分任务,向业务逻辑开发人员隐藏了对象的持久化细节。不过DAO本身并不执行真正意义上的持久化操作,需要交给JDBC、ORM框架或者JPA等API来完成。

2 基于泛型DAO的数据持久化层模型

2.1 泛型原理

Java中的类型转换分为上转型和下转型两种情况,上转型是自动转型也就是说父类的引用可以指向一个子类的实例(接口及其实现类也适用于这种情况),但这种情况子类对象就失去了自己的“特性”;下转型是强制类型转换,通常用于将上转型对象转换为一个特定类型的子类对象,在这种情况下就必须知道子类的类型否则就会出现转换异常。这个问题在泛型中得到了解决。

泛型机制自Java SE 5.0以后引入,使得相同的代码可以应用于多种类型,其目的是希望类或方法能够具备最广泛的表达能力[2]。泛型对于集合类非常有用,相比于对Object类型的变量进行强制转换操作,通过泛型的类型参数可以明确指定加入到集合中的对象类型,将来从集合中取出对象时也就不必强制转换了,从而使代码具有清晰的可读性和安全性。

2.2 泛型DAO

传统的DAO与实体类一一对应,几乎每个实体类都要经过对数据源的CRUD操作,这些操作具有相同点。定义泛型DAO就是要将相同部分的CRUD操作提取出来,如图2所示:

图2 泛型DAO类图关系

其中IGenericDAO是一个通用的泛型DAO接口,定义了几乎所有持久化类都需要的CRUD操作。由于采用JDBC对数据库执行增、删、改操作都需要调用Statement或PreparedStatement对象的executeUpdate()方法,所以将增、删、改操作统一由update()方法来定义。AbstractGeneric DAOImp这个抽象类是对IGenericDAO的一个基本实现,该类采用了模板设计模式,抽象方法rowMapper()交给子类去实现,用来完成ResultSet对象与实体类的映射关系。IConcreteEntityDAO是具体实体类所对应的DAO接口,其中可以定义该实体类特有的CRUD操作。ConcreteEntity DAOImp是具体实体类的DAO实现类。

2.3 基于泛型DAO的持久化层模型

基于泛型DAO的持久层模型包括4部分,如图3所示:

图3 数据持久化层模型

分别为:DAO工厂组件、泛型DAO组件、持久化操作组件和实体类组件。通过组件之间的划分,既可以明确职责又可以降低框架各部分之间的耦合程度,方便开发人员的分工协作。各部分组件的功能如下说明:

(1)DAO工厂组件:业务逻辑组件的数据请求都由DAO工厂类完成。DAO工厂类采用的是对象组合机制,通过DAO工厂类和DAO接口,向业务逻辑组件隐藏具体DAO实现类的创建过程。

(2)泛型DAO组件:每个实体类对应的DAO组件如图2所示,根据该实体类的具体情况可以再定义新的持久化方法。DAO组件由DAOFactory类创建。

(3)持久化操作组件:直接操作数据库的组件。能够实现某个具体实体类的CRUD操作和处理数据存取异常;负责数据库连接池的建立与管理以及返回值对象等。

(4)实体类组件:它是由普通Java对象(POJO)组成,用来在层与层之间传递数据,有些情况下也可以当做值对象来使用。每个POJO对象都包含了若干属性以及设置和获取这些属性的set()和get()方法,这些属性通常要与数据库表形成对应关系。

3 生产统计管理系统中数据持久层的实现

本节以陕西省某矿业集团计划部门的生产统计管理系统为背景,详细介绍2.3节所提出的数据持久化层中泛型DAO组件的实现过程。该系统主要是为了让计划部门利用计算机技术对所管辖的各分部门产生的实际数据进行统一管理,以便及时调整计划数据,从而为企业的决策提供支持。系统主要包括:矿区主要经济指标管理、掘进工作面管理、进尺计划完成管理、回采工作面管理、铁路运输完成管理、矿区从业人员管理、矿区企事业人员管理、矿井期末3个煤量管理、矿井安全生产管理、机电设备完好及影响、分项原煤成本管理、损益构成情况管理、经营利润实现管理和商品煤销售管理等14个管理模块[3]。

3.1 数据持久层的调用过程

数据持久层组件是由业务逻辑层调用的,调用顺序如下[4]:

(1)业务逻辑组件向DAOFactory发出请求。

(2)DAOFactory类根据请求,通过泛型DAO接口去创建相应的DAO实现类。

(3)DAO实现类通过JdbcUtil从数据库连接池获取Connection对象,完成具体的CRUD操作,将操作结果封装到实体类中。

(4)DAO类将处理结果通过DAOFactory类以值对象形式返回给业务逻辑组件。

3.2 数据持久层的具体实现

3.2.1 通用泛型DAO接口的定义

该泛型接口中定义的是系统中所有实体类所具有的公共CRUD操作,T表示任意的实体类型,ID表示实体类型对应的数据表主键。

3.2.2 通用泛型DAO接口的抽象实现

利用JDBC访问数据库通常都要执行以下操作:①加载数据库驱动②创建Connection数据库连接对象③创建执行SQL语句的Statement或PreparedStatement对象④释放连接等资源。其中①②④这3个步骤基本是固定不变的,由JdbcUtil这个工具类进行了封装。第③步操作是可变的,需要根据SQL的类型进行判断(大多数情况执行的都是数据库的DDL语句),如果是查询语句则需要将结果集与实体类的映射关系交给子类去处理。这种情况符合模板设计模式的思想:可以不改变一个算法的结构即可重定义该算法的某些特定步骤,这些特定步骤延迟到子类中进行定义[5]。因此AbstractGenericDAOImp类采用模板模式进行设计,其中可变的部分用rowMapper方法定义,具体实现过程交给子类完成。该类的相关核心代码如下所示:

3.2.3 实体类所对应的DAO接口

具体实体类所对应的DAO接口需要从IGenericDAO继承,需要显示声明T和ID所对应的类型,并且根据实际情况定义该实体所对应业务逻辑需要的CRUD操作。以回采工作面管理模块为例,需要按年、月、日等时间查看回采工作面的相关数据。该接口的相关代码如下:

3.2.4 实体类所对应的DAO接口的实现

实体类DAO的实现类继承抽象父类GenericDAOImp,需要显示声明T和ID所对应的类型,这样在返回实体类对象的方法中就无须强制类型转换了。除了实现接口中定义的方法外,该类要重写rowMapper方法,用来详细描述实体类中属性与数据库表的对应关系。以下是回采工作面DAO实现类的相关代码,以查询方法为例。

4 总结

本文基于Java泛型技术和DAO模式,设计了一种泛型DAO数据持久化层模型,通过陕西省某矿业集团生产统计管理系统详细描述了该模型组成部分的实现过程。通过泛型DAO的显示类型声明避免了强制类型转化所可能产生的异常风险;在泛型DAO的抽象实现中所采用的模板模式简化了数据库的CRUD操作避免了在实体类DAO中出现重复代码,也有利于DAO的扩展。

[1]孙霞.基于DAO 模式的持久模型的研究与设计[J].计算机系统应用,2010,19(7),107-108.

[2]Clay RW,Donald A,Scot S.Professional Java JDK 6 Edition[M].American:Wiley Publishing,2007.

[3]欧阳宏基.基于框架技术的生产统计管理系统设计与实现[J].微计算机应用,2009,30(9),76-77

[4]张俐,张维玺.改进的JDBC框架在数据持久层的应用[J].计算机工程与设计,2010,31(8),1746-1747.

[5]耿祥义,张跃平.Java设计模式[M].清华大学出版社,2009,215-216.

猜你喜欢

子类数据源组件
无人机智能巡检在光伏电站组件诊断中的应用
卷入Hohlov算子的某解析双单叶函数子类的系数估计
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
Web 大数据系统数据源选择*
Java类的继承
基于不同网络数据源的期刊评价研究
面向对象的多版本传感器观测服务模式匹配方法
基于真值发现的冲突数据源质量评价算法
风起新一代光伏组件膜层:SSG纳米自清洁膜层