CN1869991A - 基于动态代理的数据访问对象模式的实现方法 - Google Patents
基于动态代理的数据访问对象模式的实现方法 Download PDFInfo
- Publication number
- CN1869991A CN1869991A CN 200610085765 CN200610085765A CN1869991A CN 1869991 A CN1869991 A CN 1869991A CN 200610085765 CN200610085765 CN 200610085765 CN 200610085765 A CN200610085765 A CN 200610085765A CN 1869991 A CN1869991 A CN 1869991A
- Authority
- CN
- China
- Prior art keywords
- dao
- interface
- alarm
- class
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及现代企业应用软件数据持久层,尤其是基于动态代理技术的数据访问对象模式的实现方法。本发明目的是这样实现的:基于动态代理技术的数据访问对象模式的方法,由DAO一个定义了相关对象数据库操作的接口,采用的面向对象的设计,而数据库的关系模式与对象之间存在一个结构上的断层,由在数据库与域对象层加入一个转换层,即使用数据访问对象(DAO)模式层,在DAO的具体实现上采用了开源对象关系映射工具Hibernate,应由DAO层来负责与Hibernate的AP1交互,使程序的其他部分与对Hibernate的直接操作分离开来,在需要的时候替换掉Hibernate而改用其他方案来实现。
Description
技术领域
本发明涉及现代企业应用软件数据持久层,尤其是基于动态代理技术的数据访问对象模式的实现方法。
背景技术
许多真实的企业应用程序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。
数据是任何计算机应用程序最重要的方面。计算机应用程序的核心是使某人或另一个计算机系统能够访问其数据。在企业环境中,数据不仅必须是可访问的(即,与用户界面连接并按一系列业务规则管理),而且还必须是持久的。持久数据存储就是即使在服务器崩溃的情况下仍能存在的数据存储。持久数据存在于应用程序的活动内存之外,通常在数据库或平面文件系统中。虽然持久数据被读入瞬时存储器以供使用或修改,但它始终被写到外部数据存储中以长期存储。美国国家标准与技术研究所(The United States National Institute of Standards and Technology)定义了三种级别的持久数据:部分持久数据是一种仅允许对最新版本更新的持久数据结构。持久数据是一种保留其旧版本的数据结构;即,以前版本和当前版本都可能被查询。完全持久数据是一种维护其数据的所有版本并允许对这些版本更新的持久数据结构。大多数业务应用程序至少提供部分持久数据。这种类型的持久性在事务中期或者甚至在请求中期出现系统故障时容易遭破坏,这会导致数据不完整且常常遭毁坏。另一方面,在持久数据实现中,对系统中断或故障以“回滚(rollback)”回应,数据状态被回滚到上一个已知的良好配置。持久数据实现在企业体系结构和数据库管理系统(DBMS)中很常见。完全持久数据实现非常少见。完全持久数据实现的少数几个示例有:日志记录文件系统、VMS文件系统(如VAX和Mac OS X)以及并发版本控制系统(CVS)。比如,应用程序使用实体bean(这里应该是指BMP的bean,CMP的bean已大大降低了与RDBMS的耦合)的分布式组件来表示持久性数据,或者使用JDBC API来访问驻留在某关系数据库管理系统(RDBMS)中的数据,这些组件中包含连接性和数据访问代码会引入这些组件与数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序从某种数据源迁移到其他种类的数据源将变得非常麻烦和困难。当数据源变化时,组件也需要改变,以便于能够处理新类型的数据源。关系数据库管理系统(RDBMS)是一个让你创建、更新和管理一个关系数据库的程序。RDBMS软件的技巧,以及故障诊断信息。这些信息是为数据库管理员和其他负责安装和RDBMS的人员提供的。要了解这些任务的含义以及有关执行这些任务的完整指示信息,请参考数据库供应商的文档。
CN200410095805.5是将数据库从源计算机系统复制到目标计算机系统的方法,它包括以下步骤:1)接收来自于源计算机系统的日志项;2)检查日志项,查看是否在动态索引中有一个输入项,它给出与一数据库项有关的处理信息,所述日志项与该数据库有关;以及3)如果在动态表中存在输入项,则按照相关的处理信息处理日志项;或者4)如果在动态索引中没有输入项,则在分配数据库中寻找数据库项的相关处理信息,建立输入项并在动态索引中存储,并且按照处理信息处理日志项。
使用数据访问对象(DAO)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。DAO实现了用来操作数据源的访问机制。数据源可以是RDBMS,LDAP,File等。依赖于DAO的业务组件为其客户端使用DAO提供更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时,DAO向客户端提供的接口不会变化,所有该模式允许DAO调整到不同的存储模式,而不会影响其客户端或者业务组件。重要的是,DAO充当组件和数据源之间的适配器。实现结构图如下述:
bean的一站式(single-stop)解决方案同更复杂的(但更健壮的)会话bean与Java数据库连接(Java Database Connectivity,JDBC)代码的组合。可以比较Java数据对象(Java Data Object,JDO)与实体bean。
实体bean,它提供健壮的数据持久性。bean容器处理大部分的数据完整性、资源管理和并发性功能,从而使开发人员关注业务逻辑和数据处理,而不是这些低级细节。使用bean管理的持久性(Bean Managed Persistence,BMP)实体bean时,开发人员编写持久性代码而容器确定何时执行该代码。使用容器管理的持久性(ContainerManaged Persistence,CMP)实体bean时,容器生成持久性代码并管理持久性逻辑。JDBC,当与会话bean结合时,它可提供简便的EJB开发和与平台无关的部署,而没有象EJB技术那样的资源使用和内存开销。象BMP实体bean一样,该解决方案要求开发人员编写持久性代码。与BMP bean不同的是,它还要求开发人员编写持久性逻辑。因而,开发人员负责确定何时将数据持久保留在数据存储中以及何时从数据存储装入数据。Java数据对象是最新的持久性机制。JDO提供了面向对象的持久数据存储。开发人员使用POJO(无格式普通Java对象,plain ordinary Java objeet)来装入和存储持久数据。
实体bean的优点:到企业级数据持久性时,实体bean有下列优点:标准化。EJB规范定义一组与供应商无关的接口,J2EE供应商可以实现这些接口来支持实体bean。这种标准化允许采用最佳实践的开发并缩短雇用新开发人员时的适应期。因为基本的组件体系结构和设计模式大家都知道,所以很容易找到合格的人才来实现它们。容器管理的服务。正如我们在本系列的前两篇文章中讨论的那样,EJB容器管理的服务为处理诸如安全性、事务处理、连接合用和资源管理之类的企业功能提供了极大的好处。透明持久性。容器管理的服务思想在CMP实体bean中得到了进一步加强。这里,容器还自动管理持久性语义。使用BMP实体bean时,开发人员必须编写持久性逻辑,而容器则确定何时调用由开发人员定义的方法。同时使用CMP和BMP实体bean时,容器决定何时持续保持bean的状态以及如何确保与底层数据存储的数据完整性和并发性。事务支持。开发人员对CMP事务(隔离级别、事务需求和方法的包含/排除)有粗粒度的控制权,对BMP事务有细粒度的控制权,这些控制都是通过在bean代码中以程序方式处理事务语义实现的。在这两种情况下,容器管理事务并确定是否应该提交给定的事务。实体bean的缺点是设计复杂。容器管理的服务和自动透明持久性的代价很高。它们在几个级别上给应用程序设计带来复杂性。首先,为了避免网络开销并强制遵守业务规则,几乎总是通过会话bean访问实体bean。因此,每个事务至少涉及两个企业bean(往往会多得多)。涉及的组件越多,则体系结构的设计、编码和维护就变得越复杂。其次,存在自动操作成本。容器有点类似于有魔力的黑盒。只要它认为适当,就会调用bean回调方法,它可随时选择创建和破坏bean实例,激活和钝化bean,并且将其状态存储到持久数据存储中或从其中装入。应用程序代码无法控制这些事情发生的方式或时间。从积极的方面看,容器的功能减少了编写业务逻辑时要考虑的问题数量。从消极的方面看,容器对装入条件和数据请求模式的响应是不可预知的,所以必须在开发过程中添加大量的基于方案的装入测试。
较长的构建周期。由于企业bean和(尤其是)实体bean的复杂性,所以一次迭代(设计/构建/测试/集成/测试/部署)所花的时间比可比较的Java持久性解决方案所花的时间长两到三倍。
响应时间。根据服务器上的负载和所请求实体bean的相对大小,实体bean的查询可能有不达标的响应时间。实体bean在本质上受限于bean实例的粒度。要么必须装入整个bean,要么根本无法装入bean。该粒度会促使体系结构变得更复杂,因为唯一的选择就是用较差的响应时间使bean保持原样,还是将数据分成更小的实体,从而使系统体系结构变得更复杂。资源使用情况。所有企业bean都是资源霸占者。
会话bean和JDBC:无状态会话bean的受欢迎程度不象实体bean那样大起大落(请参阅侧栏)。事实上,在普及和功能方面,无状态会话bean自1999年(当年发行了EJB规范)开始就一直保持稳定和可靠。它们产生性能极佳的结果和有效的资源合用,并且是EJB系列的一个重要工作程序组件。无状态的会话bean的稳定性和可预知性使它们成为管理持久企业数据的优秀候选者。在基于会话bean和JDBC的持久性体系结构中,会话bean将所有访问命令都委托给JDBC层。在接收调用时,会话bean使用JDBC来获得实现javax.sql.DataSource接口的对象。然后,返回的对象充当java.sql.Connection对象(由JDBC API定义)的资源管理器工厂,这些java.sql.Connection对象实现与数据库管理系统的连接。一旦获得了Connection对象,其余的持久性代码和业务逻辑(查询、更新、存储过程调用、结果集浏览和事务提交/回滚等等)就是纯JDBC。
会话bean/JDBC的优点,会话bean和JDBC成为处理企业数据持久性的极佳组合。该组合最受认可的优点如下:设计简单。从体系结构设计观点来看,通过会话bean来直接处理数据管理比使用实体bean简单得多。
细粒度的控制。因为会话bean是通用的工作程序组件,所以它们允许开发人员完全控制整个持久性过程,包括高速缓存、持久性、并发性、同步及其它。相反,CMP实体bean不允许开发人员控制持久性机制,而BMP实体bean仅使开发人员能够定义应发生什么,而不能定义应在何时或什么样的情况下发生。总之,会话bean和JDBC的组合能使开发人员对数据管理语义有细粒度的控制权,这一组合利用健壮且成熟的数据管理技术,支持功能优化,并将它全部封装成一个相对简单的组件体系结构中。会话bean/JDBC的缺点:实现复杂。虽然这种系统的体系结构设计相当简单,但实际的会话bean实现常常十分复杂。
非固有的事务性。实体bean本质上是事务性组件,这些组件具有可配置的事务语义;而会话bean没有。将事务语义直接编码到应用程序代码中时,开发人员必须处处小心以确保每个功能的业务规则、流控制和事务完整性都得以保护并且可以容错。在实体bean开发中,这些细节都由容器处理。持久性不是自动的或者得不到保证。在实体bean操作中,容器处理bean状态的持久性,并确保这种数据得到保护,供以后使用。对于会话bean,将数据保持在安全、长期的数据存储中是开发人员的责任。读/写需要。需要经常读取且从不更改或偶尔更改的数据最好由会话bean与JDBC组合来处理。开发工作会简单直接,并产生极好的响应时间。使用POJO(无格式普通Java对象,plain ordinary Java object)来装入和存储持久数据。Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping(ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型结构中去。
Hibernate不仅仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。
#持久对象实例被管理在事务结束时,此时Hibernate与数据库同步任何已经发生变化的被管理的的对象。
#Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。这里,我给出Hibernate如何实现批量插入的方法:
首先,设置一个合理的JDBC批处理大小,hibernate.jdbc.batch_size 20。然后在一定间隔对Session进行flush()和clear()。
尽管我们使用了Oracle 8.1.7作为我们的示例数据库管理系统(DBMS),但是只要其他关系数据库提供通过JDBC的连接,就可以很容易地把一般性的概念转移到这些数据库上。JDBC是标准的Java API,几乎所有需要访问数据库的J2EE应用程序都直接或间接地使用了它。在BEA WebLogic 8.1中,配置JDBC连接包括创建和配置两个主要的工件——JDBC连接池和数据源。与这两个主要工件相关的是其他次要的可配置工件,比如多池或数据源工厂。
图1中
1)BusinessObject(业务对象)
代表数据客户端。正是该对象需要访问数据源以获取和存储数据。
2)DataAccessObject(数据访问对象)是该模式的主要对象。DataAccessObject抽取该BusinessObject的低层数据访问实现,以保证对数据源的透明访问。BusinessObject也可以把数据加载和存储操作委托给DataAccessObject。
3)DataSource(数据源)
代表数据源实现。数据源可以是各RDBMSR数据库,OODBMS,XML文件等等。
4)valueObject(值对象)
代表用做数据携带着的值对象。DataAccessObject可以使用值对象来把数据返回给客户端。
DataAccessObject也许会接受来自于客户端的数据,其中这些用于更新数据源的数据存放于值对象中来传递。
Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping(ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型结构中去。
Hibernate不仅仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。
JDBC是标准的Java API,几乎所有需要访问数据库的J2EE应用程序都直接或间接地使用了它。在BEA WebLogic 8.1中,配置JDBC连接包括创建和配置两个主要的工件——JDBC连接池和数据源。与这两个主要工件相关的是其他次要的可配置工件,比如多池或数据源工厂。
如上所说,现代企业应用软件大都需要数据库的支持,为了有效封装数据持久过程,对上提供清晰的访问操作逻辑,开发过程中常使用DAO(Data Access Object)模式对上屏蔽复杂易变的数据库存取过程,DAO模式易于理解和使用,所以非常容易在各种项目中应用,但其也存在一些缺点,就是随着项目的增大,所需DAO的数量也快速增加,但每个DAO内部的代码却差不多但又不完全一样,这就造成了代码高重复率,另外DAO模式需要一个接口和一个实现类,所以DAO数量的庞大和代码高重复率造成了开发人员需要在每个项目上都花费很大的精力在DAO编写上。
发明内容
本发明目的是:通过使用Java动态代理技术,以一种通用的机制实现数据存取(DAO实现),结合代码生成工具提供与业务绑定的DAO接口,解除了数据持久层与业务逻辑之间的耦合。具有高度的通用性。
本发明目的是这样实现的:基于动态代理技术的数据访问对象模式的方法,由DAO一个定义了相关对象数据库操作的接口:所有需要的创建、读写、升级或删除CRUD(Create,Read,Update,Delete)方法,通过主键查询相关域对象的方法及查询所有相关域对象的方法使用Java动态代理方法,以一种通用的机制实现数据存取(DAO实现),结合代码生成工具提供与业务绑定的DAO接口,解除了数据持久层与业务逻辑之间的耦合;采用的面向对象的设计,而数据库的关系模式与对象之间存在一个结构上的断层,由在数据库与域对象层加入一个转换层,即使用数据访问对象(DAO)模式层,在DAO的具体实现上采用了开源对象关系映射工具Hibernate,应由DAO层来负责与Hibernate的API交互,使程序的其他部分与对Hibernate的直接操作分离开来,在需要的时候替换掉Hibernate而改用其他方案来实现。
采用了开源对象关系映射工具Hibernate的方法是:采用了一个统一入口来根据不同的域对象产生相应DAO接口的实现。这个统一入口就是IDaoFactory,这个方法接受一个域对象Class作为输入参数,通过java动态代理机制生成并返回这个域对象DAO的一个实现,IDaoFactory的定义如下:
public interface IDaoFactory{
Object getDao(Class daoInterface);}
这个接口的实现是DaoFactory。
附图说明
图1是DAO框图
图2DAO在整个应用系统中的位置的结构简图
图3传统DAO的实现
图4本发明实现技术的内部结构。
图5动态代理DAO实现
图6反映了DAO层在整个应用系统中的位置
具体实施方式
下表反映了DAO层在整个应用系统中的位置和本实现技术的主要内部结构:
详细说明:
IDaoFactory | 负责根据Dao接口产生具体Dao对象,这是一个接口 |
DaoFactory(中间) | IDaoFactory的实现 |
Proxy | 动态代理类,由Java类库提供 |
ICommand | 负责在Dao对象调用时具体执行相关操作,这是一个接口,以Command结尾的都是此接口的实现类 |
FindAllCommand | 具体执行查找全部操作 |
FindByPrimaryKeyCommand | 具体执行通过主键查找操作 |
QueriedFindCommand | 具体执行查找操作,此操作的输入参数为IQuery对象 |
FindWithNamedQueryCommand | 具体执行命名查找操作,命名查找语句预先写在hbm文件中 |
CriteriaFindCommand | 具体执行条件查询操作,此操作的输入参数为Criteria对象 |
TransactionalCommand | 这是一个抽象类,负责为其子类的数据库操作提供事务能力,以下三个Command为其子类 |
AddCommand | 具体执行增加操作 |
RemoveCommand | 具体执行删除操作 |
UpdateCommand | 具体执行更新操作 |
本实现采用hibernate进行数据模型的映射。
结合上面的内部结构图详细说明内部:
IServiceLocator 负责根据Dao接口产生具体Dao对象,这是一个接口
ServiceLocator IServiceLocator的实现
ServiceLocatorException 在产生Dao对象的过程中产生的异常
ICommand 负责在Dao对象调用时具体执行相关操作,这是一个接口,一下都是此接口的实现类
AddCommand 具体执行增加操作
FindCommand 具体执行查找操作
FindAllCommand 具体执行查找全部操作
FindByPrimaryKeyCommand 具体执行通过主键查找操作
QueriedFindCommand 具体执行查找操作,此操作的输入参数为IQuery对象
FindWithNamedQueryCommand 具体执行命名查找操作,命名查找语句预先写在hbm文件中
CriteriaFindCommand 具体执行条件查询操作,此操作的输入参数为Criteria对象
RemoveCommand 具体执行删除操作
UpdateCommand 具体执行更新操作
IQueryFactory 查询工厂,负责产生IQuery和Criteria对象,这是一个接口
QueryFactory IQueryFactory的实现
ICommonQuery 定义了IQuery的一些常用操作
IQuery 表示一个查询对象,封装了执行一个查询所需的信息,这是一个接口
QueryImpl IQuery的实现
由于整个系统采用的面向对象的设计,而数据库的关系模式与对象之间存在一个结构上的断层,为了弥补这个断层,需要在数据库与域对象层加入一个转换层(如图),即DAO(Data Access Object)层,在DAO的具体实现上采用了开源对象关系映射工具Hibernate,Hibernate包装了JDBC操作,提供了数据获取、数据更新、事务管理、数据库连接池、声明式查询等功能。
为了使程序的其他部分与对Hibernate的直接操作分离开来,同时也简化数据库模块的使用,应由DAO层来负责与Hibernate的API交互,而DAO的上层无需知道Hibernate的存在,因此可以在需要的时候替换掉Hibernate而改用其他方案来实现。一个DAO是一个定义了相关对象数据库操作的接口:所有需要的CRUD(Create,Read,Update,Delete)方法,还有通过主键查询相关域对象的方法及查询所有相关域对象的方法等。一个示例接口定义如下:public interface AlarmDao{public Object add(Alarm alarm)throws PersistenceException;public void remove(Alarm alarm)throws PersistenceException;public void update(Alarm alarm)throws PersistenceException;public Alarm findByPrimaryKey(String id)throws LookupException;public List findAll()throws LookupException;public List findAlarmByContent(String content)throws LookupException;}
这个DAO接口就是用来查找Alarm对象和对Alarm对象进行相关的CRUD操作。为了方便使用,采用了一个统一入口来根据不同的域对象产生相应DAO接口的实现。这个统一入口就是IServiceLocator,它只有一个方法,这个方法接受一个域对象Class作为输入参数,通过java动态代理机制生成并返回这个域对象DAO的一个实现,IServiceLocator的定义如下:public interface IServiceLocator{
Object getDomainObjectManager(Class daoInterface)throwsServiceLocatorException;}这个接口的实现是ServiceLocator,客户端可以方便的通过这个类的实例的方法getDomainObjectManager获得DAO实例:IServiceLocator serviceLocator=ServiceLocator.getInstance();AlarmDao alarmDao =(AlarmDao)serviceLocator.getDomainObjectManager(AlarmDao.class);然后通过DAO就可以进行相关的操作了:Alarm alarm=new Alarm();alarm.setContent("你好");alarmDao.add(alarm);//...
以上代码就是使用这个数据服务层的最简单最直接的方式,客户端完全不需要知道DAO的实现类,并且由于一切都是由动态代理实现,所以开发人员无需涉及DAO实现的编写,极大了提高了工作效率,具有极高的通用性。
另外为了更进一步简化开发,减少工作量,所有接口代码都由附带的代码生成工具生成,开发人员仅仅需要将提供已经开发完成的域对象的对象名称即可。通过动态代理和代码生成技术,完成了基于动态代理的DAO模式实现,在使用中具有极高的通用性和极低的代码编写工作量。
动态代理DAO的图中蓝色框代DAO工厂,动态代理过程就在工厂中实现,工厂负责生成一个指定DAO接口的“实现类”的对象。动态代理DAO在结构上与传统DAO非常相近,区别就在于动态代理DAO没有DAO接口的真实的实现类,其“实现类”的对象是由动态代理动态生成的,使用者从工厂得到这个“实现类”的对象,以DAO接口为句柄调用DAO方法时,方法的最终执行实际上被代理给了某个与方法相匹配的Command(见内部结构图);而传统DAO中,使用者像使用普通Java对象一样先实例化具体的DAO类,然后调用DAO方法。
下面举一个具体实施此方法的例子:
通过此方法对ALARM(告警)表进行增删改查,分成五个步骤:
1.实现ALARM表,结构如下:CREATE TABLE ALARM(
ID VARCHAR(32)PRIMARY KEY,
TIME NUMBER(19),
TYPE VARCHAR(32),
LEVEL NUMBER)
2.实现领域类
本方法采用的语言是Java,因此此领域类由Java写成。
领域类映射了数据库行数据结构,属性名称和数据库表字段名称一致,这里代表了告警,实现如下:class Alarm {
private String id;
private long time;//告警时间
private String type;
private int level;
//get,set雀略}
3.编写DAO接口
本方法中包括了一个DAO接口代码生成工具,将Alarm领域类作为此工具的输入,输出既是DAO接口文件,这里的名称是IAlarmDao.java,此文件包含接口IAlarmDao接口,代码如下:public interface IAlarmDao{
public Object add(Alarm alarm)throws PersistenceException;
public void remove(Alarm alarm)throws PersistenceException;
public void update(Alarm alarm)throws PersistenceException;
public Alarm findByPrimaryKey(String id)throws LookupException;
public List findAll()throws LookupException;
public List find_criteria(Criteria criteria)throws LookupException;}
从接口方法可以看出,此接口定义了操作数据的增删改查功能。
4.动态生成接口的实现类的对象
IAlarmDao接口仅仅定义了增删改查,要实现其功能必须有相应的实现类,这里这个实现类是由Java动态代理动态实现的,操作如下:IalarmDao alarmDao=(IAlarmDao)DaoFactory.getInstance().getDao(IAlarmDao.class);
5.使用生成的对象进行增删改查操作
alarmDao引用了实现类的对象,因此可以通过其进行增删改查操作了,举例操作如下:
●增加一个告警,即在数据库ALARM表中增加一行:alarmDao.add(new Alarm());
●删除一个告警,即在数据库ALARM表中删除一行:alarmDao.remove(alarm);其他操作类似。
内部核心接口或类实现:
1.ICommand
负责在Dao对象调用时具体执行相关操作,以告警Alarm为例,如果要增加一个告警,调用alarmDao.add(new Alarm());其最终的执行被代理给了ICommand的子类AddCommand。这个接口很简单,就只有一个方法execute,其子类根据自己的功能实现这个方法,AddCommand的execute就是实现了在数据库中增加一行的功能,其实现如下:public interface ICommand{
Object execute(java.lang.reflect.Method method,Object[]args);}
2.DaoFactory
这个类负责获取DAO接口的实现类的对象。class DaoFactory implements IdaoFactory{private static final Map COMMANDS=new Hashtable();private DaoFactory(){
COMMANDS.put("add",new AddCommand());
COMMANDS.put("update",new UpdateCommand());
COMMANDS.put("remove",new RemoveCommand());
COMMANDS.put("findByPrimaryKey",new FindByPrimaryKeyCommand());
COMMANDS.put("findAll",new FindAllCommand());
COMMANDS.put("find",new FindCommand());
COMMANDS.put("find_query",new QueriedFindCommand());
COMMANDS.put("find_criteria",new CriteriaFindCommand());}public Object getDao(Class managerClass){
return
Proxy.newProxyInstance(
managerClass.getClassLoader(),
new Class[]{managerClass},
new ManagerDelegate());}private static class ManagerDelegate implements InvocationHandler{
public Object invoke(Object proxy,Method method,Object[]args){
ICommand command=resolveCommand(method);
return command.execute(method,args,getSession());
}
private ICommand resolveCommand(Method method){
ICommand result=(ICommand)COMMANDS.get(method.getName());
if(result==null && method.getName().startsWith("find")){
result=FIND_WITH_NAMED_QUERY_COMMAND;
}
return result;
}}}
Claims (7)
1、基于动态代理的数据访问对象模式的实现方法,由DAO一个定义了相关对象数据库操作的接口:所有需要的CRUD(Create,Read,Update,Delete)方法,通过主键查询相关域对象的方法及查询所有相关域对象的方法使用Java动态代理方法,以一种通用的机制实现数据存取即DAO实现,结合代码生成工具提供与业务绑定的DAO接口,解除了数据持久层与业务逻辑之间的耦合;采用的面向对象的设计,而数据库的关系模式与对象之间存在一个结构上的断层,由在数据库与域对象层加入一个转换层,即使用数据访问对象(DAO)模式层,在DAO的具体实现上采用了开源对象关系映射工具Hibernate,由DAO层来负责与映射工具Hibernate的API交互,使程序的其他部分与对Hibernate的直接操作分离开来,在需要的时候替换掉映射工具Hibernate而改用其他方案来实现;采用了开源对象关系映射工具Hibernate的方法是:采用了一个统一入口来根据不同的域对象产生相应DAO接口的实现。这个统一入口就是IDaoFactory,这个方法接受一个域对象Class作为输入参数,通过java动态代理机制生成并返回这个域对象DAO的一个实现。
2、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是统一入口来根据不同的域对象产生相应DAO接口的实现,统一入口IDaoFactory的定义如下:public interface IDaoFactory{
Object getDao(Class daoInterface);}
这个接口的实现是DaoFactory。
3、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是编写DAO接口的方法是:包括了一个DAO接口代码生成工具,将Alarm领域类作为此工具的输入,输出既是DAO接口文件,这里的名称是IAlarmDao.java,此文件包含接口IAlarmDao接口,代码如下:public interface IAlarmDao{
public Object add(Alarm alarm)throws PersistenceException;
public void remove(Alarm alarm)throws PersistenceException;
public void update(Alarm alarm)throws PersistenceException;
public Alarm findByPrimaryKey(String id)throws LookupException;
public List findAll()throws LookupException;
public List find_criteria(Criteria criteria)throws LookupException;}从接口方法可以看出,此接口定义了操作数据的增删改查功能。
4、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是动态生成接口的实现类的对象IAlarmDao接口仅仅定义了增删改查,要实现其功能必须有相应的实现类,这里这个实现类是由Java动态代理动态实现的,操作如下:
IalarmDao
alarmDao=AlarmDao)DaoFactory.getInstance().getDao(IAlarmDao.class)。
5、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是使用生成的对象进行增删改查操作alarmDao引用了实现类的对象,通过其进行增删改查操作:
a)增加一个告警,即在数据库ALARM表中增加一行:alarmDao.add(newAlarm());
b)删除一个告警,即在数据库ALARM表中删除一行:alarmDao.remove(alarm);其他操作类似。
6、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是内部核心接口或类实现:ICommand负责在Dao对象调用时具体执行相关操作,如果要增加一个告警,调用alarmDao.add(new Alarm());其最终的执行被代理给了ICommand的子类AddCommand。
7、根据权利要求1所述的基于动态代理的数据访问对象模式的实现方法,其特征是设有DaoFactory,这个类负责获取DAO接口的实现类的对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200610085765 CN1869991A (zh) | 2006-06-30 | 2006-06-30 | 基于动态代理的数据访问对象模式的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200610085765 CN1869991A (zh) | 2006-06-30 | 2006-06-30 | 基于动态代理的数据访问对象模式的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1869991A true CN1869991A (zh) | 2006-11-29 |
Family
ID=37443655
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200610085765 Pending CN1869991A (zh) | 2006-06-30 | 2006-06-30 | 基于动态代理的数据访问对象模式的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1869991A (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101398922A (zh) * | 2008-10-21 | 2009-04-01 | 金蝶软件(中国)有限公司 | 数据同步方法及装置 |
CN102508673A (zh) * | 2011-12-02 | 2012-06-20 | 方正国际软件有限公司 | 快速开发与配置平台类软件的系统及方法 |
CN101430643B (zh) * | 2007-11-05 | 2012-06-27 | 国际商业机器公司 | 提供项目开发环境的方法和装置,以及项目开发系统 |
CN102819588A (zh) * | 2012-08-06 | 2012-12-12 | 南京中兴软创科技股份有限公司 | 一种应用于Oracle数据库的动态数据处理方法 |
CN103064964A (zh) * | 2012-12-29 | 2013-04-24 | 天津南大通用数据技术有限公司 | 一种支持分布式事务的数据库的连接方法 |
CN103136041A (zh) * | 2011-12-01 | 2013-06-05 | Sap股份公司 | 业务对象的批处理 |
CN103617167A (zh) * | 2013-10-22 | 2014-03-05 | 芜湖大学科技园发展有限公司 | 一种通用的元数据/关系映射框架 |
CN104714813A (zh) * | 2013-12-13 | 2015-06-17 | 航天信息股份有限公司 | 一种基于代理模式的android数据库延迟加载方法 |
CN102214094B (zh) * | 2010-04-08 | 2016-08-17 | 西门子公司 | 经由异步编程模型执行操作 |
CN106095600A (zh) * | 2008-10-10 | 2016-11-09 | 因特伟特公司 | 用于促进持久化应用编程接口的方法和装置 |
CN107977470A (zh) * | 2017-12-22 | 2018-05-01 | 陈瑞 | 一种介入对象内部行为的方法及相关装置 |
CN108090063A (zh) * | 2016-11-21 | 2018-05-29 | 深圳联友科技有限公司 | 一种可配置的组件数据访问方法及装置 |
CN110019212B (zh) * | 2017-11-29 | 2021-06-18 | 杭州海康威视数字技术股份有限公司 | 一种数据处理方法、装置及数据库服务器 |
-
2006
- 2006-06-30 CN CN 200610085765 patent/CN1869991A/zh active Pending
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101430643B (zh) * | 2007-11-05 | 2012-06-27 | 国际商业机器公司 | 提供项目开发环境的方法和装置,以及项目开发系统 |
CN106095600A (zh) * | 2008-10-10 | 2016-11-09 | 因特伟特公司 | 用于促进持久化应用编程接口的方法和装置 |
CN101398922A (zh) * | 2008-10-21 | 2009-04-01 | 金蝶软件(中国)有限公司 | 数据同步方法及装置 |
CN102214094B (zh) * | 2010-04-08 | 2016-08-17 | 西门子公司 | 经由异步编程模型执行操作 |
CN103136041A (zh) * | 2011-12-01 | 2013-06-05 | Sap股份公司 | 业务对象的批处理 |
CN103136041B (zh) * | 2011-12-01 | 2019-01-25 | Sap欧洲公司 | 业务对象的批处理 |
CN102508673A (zh) * | 2011-12-02 | 2012-06-20 | 方正国际软件有限公司 | 快速开发与配置平台类软件的系统及方法 |
CN102508673B (zh) * | 2011-12-02 | 2015-07-29 | 方正国际软件有限公司 | 快速开发与配置平台类软件的系统及方法 |
CN102819588A (zh) * | 2012-08-06 | 2012-12-12 | 南京中兴软创科技股份有限公司 | 一种应用于Oracle数据库的动态数据处理方法 |
CN103064964A (zh) * | 2012-12-29 | 2013-04-24 | 天津南大通用数据技术有限公司 | 一种支持分布式事务的数据库的连接方法 |
CN103064964B (zh) * | 2012-12-29 | 2016-04-20 | 天津南大通用数据技术股份有限公司 | 一种支持分布式事务的数据库的连接方法 |
CN103617167B (zh) * | 2013-10-22 | 2017-05-31 | 芜湖大学科技园发展有限公司 | 一种通用的元数据/关系映射框架 |
CN103617167A (zh) * | 2013-10-22 | 2014-03-05 | 芜湖大学科技园发展有限公司 | 一种通用的元数据/关系映射框架 |
CN104714813A (zh) * | 2013-12-13 | 2015-06-17 | 航天信息股份有限公司 | 一种基于代理模式的android数据库延迟加载方法 |
CN104714813B (zh) * | 2013-12-13 | 2019-04-23 | 航天信息股份有限公司 | 一种基于代理模式的android数据库延迟加载方法 |
CN108090063A (zh) * | 2016-11-21 | 2018-05-29 | 深圳联友科技有限公司 | 一种可配置的组件数据访问方法及装置 |
CN110019212B (zh) * | 2017-11-29 | 2021-06-18 | 杭州海康威视数字技术股份有限公司 | 一种数据处理方法、装置及数据库服务器 |
CN107977470A (zh) * | 2017-12-22 | 2018-05-01 | 陈瑞 | 一种介入对象内部行为的方法及相关装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1869991A (zh) | 基于动态代理的数据访问对象模式的实现方法 | |
US6243709B1 (en) | Method and apparatus for loading stored procedures in a database corresponding to object-oriented data dependencies | |
CN101405729B (zh) | 具有增量式视图维护的映射体系结构 | |
US20160357549A1 (en) | Reducing downtime during upgrades of interrelated components in a database system | |
CN101040280A (zh) | 元数据管理 | |
US20030177114A1 (en) | System and method for where-used searches for data stored in a multi-level hierarchical structure | |
NZ544991A (en) | Platform for data services across disparate application frameworks with API and common data model | |
CN1804840A (zh) | 数据访问层类生成器 | |
CN102841889A (zh) | 一种基于orm架构的高效数据库访问的实现方法及装置 | |
US20040044989A1 (en) | Apparatus and method using pre-described patterns and reflection to generate source code | |
Wiil et al. | Hyperform: A hypermedia system development environment | |
Sagawa | Repository manager technology | |
CN1729448A (zh) | 透明ejb支持和水平数据分割 | |
King et al. | Hibernate reference documentation | |
Hsu et al. | Metadatabase modeling for enterprise information integration | |
EP1040432B1 (en) | Method and apparatus for loading stored procedures in a database corresponding to object-oriented data dependencies | |
Vrhovnik et al. | An overview of SQL support in workflow products | |
Kaczmarczyk et al. | A Simple and effective ADO. NET-based ORM layer | |
Marshall et al. | Pro Active Record | |
US20100023923A1 (en) | Method for medeling objects in a hetrogenious computing environment | |
Borys et al. | Improving data processing performance for web applications using object-relational mapping | |
CN117667260A (zh) | 一种基于Java的动态ORM组件 | |
Bandinelli et al. | Experiences in the Implementation of a Process‐centered Software Engineering Environment Using Object‐Oriented Technology | |
Korotkevitch et al. | System Design Considerations: Dmitri Korotkevitch and Maxim Alexeyev | |
Borovskiy et al. | Data manipulation APIs for ERP systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |