13.4 数据访问层设计 ★★★☆☆
13.4.1 5种数据访问模式
1.在线访问
最基本的数据访问模式,也是在实际开发过程中最常采用的。
会占用一个数据库连接,读取数据,每个数据库操作都会通过这个连接不断地与后台的数据源进行交互。
2. DataAccess Object
DAO模式是标准 J2EE 设计模式之一,开发人员常常用这种模式将底层数据访问操作与高层业务逻辑分离开。
一个典型的 DAO 实现通常有以下组件。
(1)一个DAO工厂类。
(2) 一 个DAO接口。
(3)一个实现了DAO接口的具体类。
(4)数据传输对象。
这当中具体的 DAO类包含访问特定数据源的数据的逻辑。
3.Data Transfer Object
Data Transfer Object是经典EJB 设计模式之一。DTO是一组对象或是数据的容器,它需要跨不同的进程或是网络的边界来传输数据。
在具体设计这类对象 (DTO) 时,通常有两种选择
(1)使用编程语言内置的集合对象,通常只需要一个类,就可以在整个应用程序中实现任何数据的传输;几乎所有的编程语言都内置了集合类型,不需要再另外编写实现代码。
(2)通过创建自定义类来实现DTO 对象,通过定义显示的get 或是 set方法来访问数据。
两种方法优点结合:
代码生成技术,可以生成脱离现有元数据(如可扩展标记语言XML架构)的自定义DTO类的源代码;
提供更强大的集合,将关系和数据类型信息与原始数据存储在一起,如SDO、DataSet
4.离线数据模式
离线数据模式是以数据为中心,数据从数据源获取之后,将按照某种预定义的结构存放在系统中,
5.对象/关系映射 (Object/Relation Mapping,O/R Mapping)
对象/关系映射能够帮助将应用程序中的数据转换成关系型数据库中的记录;或是将关系数据库中的记录转换成应用程序中代码便于操作的对象。
13.4.2 工厂模式在数据访问层应用
工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类 的实例化延迟到其子类。
DataAccess 实现一个抽象的 AbstractDataAccess类,包含一些公用方法。然后,分别为SQL Server、Oracle和 OleDb数据库编写三个数据访问的具体实现类。
13.4.3 ORM、Hibernate与CMP2.0设计思想
ORM(Object-Relation Mapping) 在关系型数据库和对象之间作一个映射,使用 ORM可以大大降低学习和开发成本。
Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC 进行了轻量级的对象封装,使Java程序员可以使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,还提供了数据查询和恢复机制。
13.4.4 灵活运用XML Schema
XML Schema用来描述XML文档合法结构、内容和限制。可以用来评估一个格式良好元素和属性信息的有效性。XMLSchema是Schema组件的集合,这些组件分为三组:基本组件、组件和帮助组件。其中
基本组件包括简单类型定义、复杂类型定义、属性声明和元素声明;
组件包括属性组、完整性约束定义、模型组和符号声明;
帮助组件包括注释、模型组、小品词、通配符和属性使用。
Schema组件详细说明了抽象数据模型的每个组件的严格语义,每个组件在 XML中的表示,一个XMLSchema文档类型的DTD和XMLSchema引用。
XML Schema提供了创建XML 文档必要的框架,详细说明了一个XML文档的不同元素和属性的有效结构、限制和数据类型。XML Schema规范由如下三部分组成。
(1)XML Schema Part0:Primer。一个非标准化的文档,提供了XML Schema 的一个简单可读的描述,目的是快速地理解如何利用 XML Schema语言创建一个Schema (框架)。
(2)XML Schema Partl:Structures。详细说明了 XML Schema定义语言,为描述XML1.0 文档的结构和内容限制提供了便利。
(3)XML Schema Part2:Datatypes。定义了可用于 XMLSchema和其他XM L规 中的定义数据类型的方法,提供了丰富的数据类型,实现了继承和复用,与命名空间紧密联系,易于使用。
XMLSchema规范提供了丰富的数据类型。其中不仅包括一些内嵌的数据类型,如string、integer、Boolean、time和date等,还提供了定义新类型的能力,如complexType和simpleType。开发者可以利用内嵌的数据类型和用户定义的数据类型,有效地定义和限制XML文档的属性和元素值。
XML Schema支持继承。可以利用从已经存在的Schema 中获得某些类型而 构造新的 Schema, 也可以在不需要时使获得的类型无效。同时, XML Schema能将一个 Schema 分成单独的组件,在写Schema 时,就可以正确地引用已经定义的组件。继承性使得软件复用更加有效,极大地提高了软件开发和维护的效率。
13.4.5 事务处理设计
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation) 和持久性(Durability)的缩写。
原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
一般情况下, J2EE 应用服务器支持JDBC 事务、 JTA(Java Transaction API) 事务和容器管 理事务。一般情况下,最好不要在程序中同时使用上述三种事务类型,例如在JTA 事务中嵌套 JDBC事务。另外,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。