一.几种数据访问模式
1.在线访问
在线访问是最基本的数据访问模式,也是实际开发过程中最常用的。这种数据访问模式会占用一个数据库连接,读取数据,每个数据库操作都会通过这个连接不断地与后台的数据源进行交互。
2.Data Access Object
DAO模式是J2EE设计模式之一,开发人员常常用这种模式将底层数据访问操作与高层业务逻辑分开。
一个典型的DAO实现通常有以下组件:(1)一个DAO工厂类;(2)一个DAO接口;(3)一个实现了DAO接口的具体类;(4)数据传输对象。这当中具体的DAO类包含访问特定数据源的数据逻辑。
3.Data Transfer Object
Data Transfer Object是经典的EJB设计模式之一。DTO本身是这样一组对象或是数据的容器,它需要跨不同的进程或是网络的边界来传输数据。这类对象本身不包含具体的业务逻辑,并且通常这些对象内部只能进行一些诸如内部一致性检查和基本验证之类的方法,而且这些方法最好不要再调用其他的对象行为。
4.离线数据模式
离线数据模式是以数据为中心,数据从数据源获取之后,将按照某种预定义的结构存放在系统中,成为应用的中心,离线,对数据的各种操作独立于各种与后台数据源之间的连接或是事务;与XML集成,数据可以方便地与XML格式的文档之间相互转换;独立于数据源,离线数据模式的不同实现定义了数据各异的存放结构和规则,这些都是独立于具体的某种数据源的。
5.对象/关系映射(ORM)
大多数应用中的数据都是依据关系模型存储在关系型数据库中;而很多应用程序中的数据在开发或是运行时则是以对象的形式组织起来的。 那么,对象/关系映射就提供了这样一种工具或是平台,能够帮助将应用程序中的数据转换成关系型数据库中的记录;或是将关系数据库中的记录转换成应用程序中代码便于操作的对象。
二.工厂模式在数据访问层应用
我们希望在编写应用系统的时候,不因为多种不同种类的数据库而受到影响,尽量做到数据库无关。这就需要在实际开发过程中将这些数据库访问类再做一次封装。经过这样的封装,不仅可以达到上述目的,还可以减少操作数据库的步骤,减少代码编写量。工厂设计模式是使用的主要方法。
工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到子类。这里可能会处理对多种数据库的操作,因此,需要首先定义一个操作数据库的接口,然后根据数据库的不同,由类工厂决定实例化哪个类。
三.ORM、Hibernate设计思想
ORM(Object Relation Mapping)在关系型数据库和对象之间做一个映射,这样,在具体操作数据库时,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样即可。
当开发一个应用程序的时候,可能会涉及许多数据的访问层的代码,用来从数据库保存、删除和读取对象信息等,然而这些代码写起来总是重复的。使用ORM可以大大降低学习和开发成本。而在实际的开发中,真正对客户有价值的是其独特的业务功能,而不应该把大量时间花在编写数据库访问,CRUD方法、后期的bug查找和维护上。使用ORM之后,ORM框架已经把数据库转变成了熟悉的对象,只需要了解面向对象开发就可以实现数据库应用程序的开发,不需要浪费时间在SQL上,同时也减少了代码量,减少出错的机会。
Hibernate是一个开发源码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,是Java程序员可以随心所欲地使用对象编程思维来操作数据库。它不仅提供了从Java类到数据表之间的映射,还提供了数据查询和恢复机制。另外Hibernate可以利用代理模式来简化装入类的过程,这将大大减少Hibernate QL从数据库提取数据的代码编写量。
Hibernate技术本质上是一个提供数据库服务的中间件,它利用数据库以及其他一些配置XML Mapping等来为应用程序提供数据持久化服务的。Hibernate具有很大的灵活性,但同时它的体系结构比较复杂,提供了好几种不同的运行方式。在轻型体系中,应用程序提供JDBC 连接,并且自行管理事务,这种方式使用了Hibernate的一个最小子集。在全面解决体系中,对于应用程序来说,所有底层的JDBC/JTA API 都被抽象了,Hibernate会照管所有的细节。
四.灵活运用XML Schema
XML Schema用来描述文档合法结构、内容和限制。XML Schema由XML 1.0描述,并且使用了命名空间,有丰富的内嵌数据类型及其强大的数据结构定义功能,充分地改造了并且扩展了DTDs的能力。
XML Schema由诸如类型定义和元素声明的组件组成,可以用来评估一个格式良好的元素和属性信息的有效性。XML Schema是Schema组件的集合,这些组件分为三组:基本组件,组件和帮助组件。
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 文档的结构和内容限制提供了便利,包括开发了 XML Namespace (命名空间) 的使用。
(3)XML Schema Part2:Datatypes。 这一部分定义了可用于 XML Schema和其他 XML 规范中的定义数据类型的方法。
与DTD不同, XML Schema 规范提供了丰富的数据类型。其中不仅包括一些内嵌的数据类型,如string、integer、Boolean、time 和 date等,还提供了定义新类型的能力。
XML Schema支持继承是它的另一特点。可以利用从已经存在的Schema中获得某些类型而构造新的 Schema, 也可以在不需要时使获得的类型无效。同时, XML Schema能将一个 Schema分成单独的组件,这样,在写Schema时,就可以正确地引用已经定义的组件。继承性使得软件复用更加有效,帮助开发者避免了每一次创建都要从零开始,极大地提高了软件开发和维护的效率。
五.事务处理设计
事物是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一部也不执行,我们称该组处理步骤为一个事务。事务必须服务原子性,一致性、隔离性和持久性等原则。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
六.连接对象管理设计
在基于JDBC的数据库应用开发中,数据库连接的管理是一个难点。对于资源共享,可以建立一个数据库连接池,提供一套高效的连接分配、使用策略。有了这个连接池,下面就可以提供一套自定义的分配、释放策略。
当客户请求数据库连接时,首先看连接池中是否有未分配出去的连接。如果存在空闲连接则把连接分配给客户,并作相应处理。若连接池中没有空闲连接,就在已经分配出去的连接中,寻找一个合适的连接给客户,此时该连接在多个客户间复用。 当客户释放数据库连接时,可以根据该连接是否被复用,进行不同的处理。如果连接没有使用者,就放入到连接池中,而不是被关闭。 可以看出,正是这套策略保证了数据库连接的有效复用。