一种数据持久化实现方法

文档序号:6464570阅读:124来源:国知局
专利名称:一种数据持久化实现方法
技术领域
本发明涉及数据处理领域,具体涉及一种数据持久化实现方法。
背景技术
随着企业的发展,企业数据种类越来越多且数据结构变化迅速。这些数据自身通常存在 以下特点(1)数据资源的种类多,访问方法多样,越来越需要操作大量异构的数据,并且
随时会有各类新的数据产生;(2)数据资源所包含的属性会随时更新,所含的信息会根据业 务需要随时修改。如何统一高效的管理这些多样易变的数据是目前企业数据持久层实现中亟 待解决的问题。
Ruby on Rails (ROR)是一个支持数据库的Internet应用程序的Ruby框架,它不 采用配置文件这种策略保持灵活性。Rails中方法、类、表和列釆用普通的项目目录结构和 简单普通的命名约定,这些约定已配置在应用程序中。因此Rails应用程序只需要对应Java 应用程序的小部分配置代码, 一般是十分之一或更少。
反射是动态发现类型信息的能力。反射机制是在运行状态中,对于任意的类都能够知道 这个类的所有属性和方法,对于任意的对象都能任意调用它的方法,这种动态获取信息以及 动态调用对象方法的功能称为反射机制。现今很多语言都支持反射的功能,例如java语言 提供的反射功能都在java.lang.reflect包里实现并提供相应的API方便用户调用。
当前,对于数据持久化通常采用J2EE模式,使用其硬编码的DAO设计思想实现对象 模型到关系模型的映射,这种方法存在以下问题
第一、编码工作量大,且重复工作较多。在数据持久化操作中存在很多通用的操作,例 如CRUD操作,如果针对每种业务实体编写其数据访问的CRUD操作,不仅工作量大且效 率较低。
第二、硬编码的DAO方式不能很好地适应关系模型的变化。当关系模型改变时,需要 手工修改代码并对代码需进行重新测试,导致编码出错的可能性较高。
第三、当需要引入新的数据资源时,必须针对这种新数据编写单独的数据访问类,代码 不能复用。
另外,目前持久化技术中还经常采用Hibernate方法,但此种方法针对每种对象纟莫型都 需要保存配置文件,以映射到关系模型,对于大型的企业应用,其配置文件数量众多且难于 管理。
因此目前的持久化技术难以满足数据种类繁多、数据更新频繁的应用需求,无法提供统
一的数据访问接口,对开发效率有不利影响,而且会降低系统整体的可扩展性和可维护性。 发明 内容
本发明提供了一种数据持久化实现方法,在数据库中构建与业务实体类对应的表,使用
反射类库API获取业务实体类的字段信息,从而构造相应的SQL语句,实例化应用层所传 递参数相应的数据访问类,并使用反射类库激活参数中的获取方法后,将字段的值赋给相应 的SQL语句,执行后完成调用,本方法使得对于数据的持久化操作可以自适应对象数据模型 和关系数据模型的变化,使得不再需要大量的配置文件来维护对象数据模型与关系数据模型 之间的映射;提供了统一的数据访问接口,不需绑定具体的业务逻辑和数据方案,可以在其 他系统中复用,从而提高了持久层的开发效率,实现数据逻辑和业务逻辑的有效分离,提高 系统的可扩展性。
一种数据持久化实现方法,包括如下步骤
步骤l:根据具体的业务需求构建数据库,按照POJO构建与数据库表对应且字段名称一 致的业务实体类,并配置数据库连接池。
步骤2:应用层根据统一访问接口向数据持久化层提出访问请求,接收到请求后,首先使 用反射机制的类库获取访问请求中参数所属的业务实体类名,在配置文件中査找是否存在与 该业务实体类名对应的数据访问类,若不存在则提示用户并退出操作,若存在加载并生成该 数据访问类的一个实例。
步骤3:调用数据访问类实例中与提出的访问请求相一致的数据操作。首先判断对于该业 务实体类进行CRUD操作的SQL语句是否保存在数据访问类中,若已保存在数据访问类中转 步骤4;若没有则通过反射机制的类库获取业务实体类的字段名称与类型,构造对业务实体类 进行CRUD的操作信息保存在数据访问类中。
步骤4:访问请求从数据访问类中遍历査找,取出与访问请求相应的操作信息。初始化 数据库操作的条件,包括从数据库连接池中获取连接,建立操作语句和数据结果集。
步骤5:根据取出操作信息的字段名称及字段类型,获取各访问请求的字段名称对应的方 法,并调用这些方法获取相应的字段内容值,将获得的值赋给对应操作信息中的SQL语句。
步骤6:执行操作信息中的SQL语句,如果执行成功,则将结果返回至应用层,并关闭 数据库连接;否则,捕获并处理异常信息,再关闭数据库的连接。
所述步骤2中,业务实体类与数据访问类的配置文件采用XML文件的形式,每条记录包 括业务实体类的名称和该类相应的数据访问类的名称。
所述步骤3中采用反射机制的类库动态获取业务实体类的字段名称和字段类型,这些信息 用来构造CRUD数据操作的SQL语句,使用自定义的数据结构保存CRUD操作的含义,包含 的信息有操作的描述、操作的SQL语句、SQL语句的字段名称及字段类型;SQL语句的字
段名称及字段类型采用键值对的形式保存。
所述步骤5中获取各访问请求的字段名称对应的方法时,按操作信息中SQL字段名称的
顺序依次利用反射机制的类库激活访问请求参数中该字段所对应的方法;如果字段类型为布
尔型,则获取该字段的方法名称为"Is+字段名()",否则获取该字段的方法名称为"Get+字 段名()",并将获得的字段内容赋给操作信息中的对应SQL语句。 本发明一种数据持久化实现方法的优点在于
(1) 由于本方法使用反射自动生成业务实体类的数据访问操作,因此使得数据访问代码 的实现与具体业务实体类无关,应用系统可以方便地在该方法的基础上引进新的数据资源,
提高了系统的扩展性;
(2) 由于使用反射API获取业务实体类的内部信息,动态生成相应的CRUD操作,因 此避免数据访问代码的重复开发;
(3) 由于业务实体类的建立符合一定的约定,因此提供统一、灵活、高效、安全的数据 访问服务;
(4) 由于使用反射API获取业务实体类的字段信息构造类的CRUD操作,使得数据访 问的实现能够自适应不同的业务实体类以及类的变化,因此不需绑定具体的业务逻辑和数据 方案,可以在其他系统中复用,从而减少了应用开发量,提高了软件系统的开发效率。


图1为本发明一种数据持久化实现方法的方法流程图2为本发明一种数据持久化实现方法的业务实体类与数据访问类映射的XML schema ,
图3为本发明一种数据持久化实现方法的业务实体类与数据访问类映射XML文件实例; 图4为本发明一种数据持久化实现方法的数据访问类add操作的流程图。
具体实施例方式
下面将结合附图对本发明作进一步的详细说明。
本发明的目的是提出一种数据持久化实现方法,通过本发明使得对于数据的持久化操作 可以自适应对象数据模型和关系数据模型的变化,使得不再需要大量的配置文件来维护对象 数据模型与关系数据f莫型之间的映射,从而提高了持久化操作的效率,实现数据逻辑和业务 逻辑的有效分离,提高系统的可扩展性。
本发明一种数据持久化实现方法,如图1所示,包括如下步骤
步骤一分析具体的业务需求,列出其中的实体及应包含的信息和信息类型,根据列出 的实体构建数据库,使数据库中的每张表能够反映业务中的相应实体,并且按照具体的业务 需求,配置数据库连接池以便拥有较高的访问效率。
在数据库设计完成的基础上,构建每张数据库表对应到程序的业务实体类。POJO(Plain Old Java Object)为一种类的设计禾莫式,POJO包括字段和对字段的get和set方法,且字 段的类型为原始类型。在该持久化方法中业务实体类采用POJO的样式实现。在业务实体类 的设计中存在以下约定
*类的字段与关系数据库表的字段一一对应且名称与类型一致,这样使用反射API从 对象模型获取的字段信息构造的SQL语句能够与数据库匹配。
*类继承同一个接口,因此采用面向接口编程能够提供统一调用接口方便用户的调用。
*类与数据库表中存在ID字段以便唯一的标识类的对象和数据库表的某一行记录,方 便以ID为唯一的字段构建模型CRUD操作的SQL语句。
数据库连接池是持久层中保存并管理数据库连接的模块,使用数据库连接池的优点在于 每次获取或关闭数据库的连接不再直接与数据库服务器交互而是由本地数据库连接池分配与 收回。在客户端请求数据库连接的时候会査看连接池中是否有空闲的连接以供使用,若有则 返回空闲的连接否则提示用户暂时等待,客户端关闭数据库连接的时候会将该连接返回连接 池中以便再次使用。
本实施例中采用图书馆管理系统,以管理员实体为例,在关系数据库存在与管理员相对 应的数据表Managerlnfo,在程序中也存在与管理员相对应的业务实体类Manager, Managerlnfo和Manager含有的字段名称与类型完全一致,配置数据库连接池。
步骤二应用层根据统一访问接口向数据持久化层提出访问请求,数据持久化层将业务 逻辑层与物理数据库隔离开,使业务逻辑层的人员无须关心将对象数据持久化到物理数据库 的过程,在本方法中包括业务实体类、业务实体类对应的数据访问类。数据持久化层接收到 访问请求后,首先根据反射机制的类库获取访问请求中参数所属的业务实体类名,然后在业 务实体类与数据访问类映射的配置文件中查找是否存在与该业务实体类对应的数据访问类。 若不存在则提示用户未配置该业务实体类的数据访问类并退出操作,若存在转步骤三。
如图2、图3所示,业务实体类与数据访问类的配置文件采用XML文件的形式,每条 记录包括业务实体类的名称和该类相应的数据访问类的名称。图2为该配置文件的XML Schema,图3为该配置文件的一个示例。配置文件的一条记录包含两种信息ModelName 即模型的完整名称(包含包名的类名称),图3中的Role.libr.Manager为完整的Manager 类的名称,Role.libr在Java语言中表示Manager类所属包的名称;DAOName即 ModelName表示的类对应的数据访问类的完整名称(包含包名的数据访问类名称),图3中 的Lib.DAO.ManagerDAO为Role.libr.Manager类的数据访问类的名称,Lib.DAO在 Java语言中表示ManagerDAO类所属包的名称。该XML配置文件采用DOM(文件对象模 型)方式解析,并采用键值对4ey,valu。的形式保存解析出的内容,key为类的完整名称,
value为key对应的访问类的完整名称。图3所示键值对为<Role.libr.Manager, Lib.DAO.ManagerDAO> 。
本实施例中,应用层调用add (IModelmodel), IModel为所有的业务实体类继承的接 口, model为传递的参数值。首先利用Java反射机制的类库java.lang.Class类获取应用 层传递的参数的类名Role.libr.Manager,根据获得的业务实体类名在配置文件中查找与 Role.libr.Manager类禾目应的数据i方问类,艮卩査找ModelName为Role.libr.Manager的 DAOName得到Lib.DAO.ManagerDAO,加载Lib,DAO.ManagerDAO类并生成该类的 一个实例。
步骤三调用数据访问类实例中与提出的访问请求相一致的数据操作,首先判断该业务 实体类CRUD操作的信息是否已经保存在数据访问类中,CRUD(增、删、改、查)操作为所 有模型所共有且与业务无关的操作,可以使用Java反射机制的类库java.lang.reflect包获 取业务实体类的字段信息构造CRUD的SQL语句而不需用户手工编写,不仅节省开发者的 时间而且这些SQL语句会适应业务实体类的变化。若已保存继续步骤四。
否则,利用Java反射机制的类库java.lang.reflect包获取业务实体类中的字段名称, 构造对业务实体类进行CRUD操作的SQL语句。
以构造Role.libr.Manager的insert语句为例说明构造CRUD的SQL语句过 程:Manager中含有字段ID(int)、 name(String)、 department(String)、 active(boolean)。 将SQL语句分为三部分进行构造SQLHead即insert into managerinfo、 SQLMid即数 据库中表的字段、SQLTail即values之后的语句。通过Java反射机制的类库 java.lang.reflect包,获取业务实体类中的字段信息,遍历类的字段将字段名称加入 SQLMid, SQLTail中加入一个代表参数的问号。例如遍历到ID时,SQLMid为"(ID", SQLTail为"values( ";在遍历到name时,SQLMid为"(ID, Name" , SQLTail为
"values( , ",遍历完成后为SQLMid为"(ID, name,department,active) " , SQLTail 为"values( ,?,?,?)"。遍历中以(key, value)的形式保存insert语句中字段名称及字段 类型,例如Manager对应的insert语句字段名称及字段类型有("ID", "int"),( "name",
"String" ),( "department" , "String" ), ("active", "boolean")。遍历类的字段完成 后将SQLHead、 SQLMid和SQLTail连接即构成该类的insert语句insert into managerinfo(ID , name,department,active) values( ,?,?,?)。其余selects update、 delete 语句与此类似。
由于步骤一业务实体类字段名称和类型与数据库表字段名称和类型保持一致,因此由业 务实体类字段的名称构造的SQL语句能够与数据库匹配。将构造的CRUD的SQL语句及 其字段信息采用OpDescription类保存,OpDescription包含三种信息操作的描述、SQL
语句、SQL语句中的字段名称和字段类型。操作的描述可以事先约定,如add操作的描述为 "add"、 update操作的描述为"update",数据访问类可根据具体业务需求添加符合业务 逻辑的操作。并将OpDescription对象保存在该业务实体类对应的数据访问类中。
步骤四访问请求从数据访问类中遍历查找,取出与访问请求相应的操作信息。例如 调用add方法取出操作描述为"add"的OpDescription对象。然后初始化操作数据库的 条件,包括利用从数据库连接池中获取数据库连接,根据操作信息中的SQL语句建立操作语 句和数据结果集。
步骤五如图4所示,根据操作描述取出相应的OpDescription对象,按OpDescription 对象字段名称的顺序依次利用Java反射机制的类銜ava.lang.reflect包激活数据访问参数中 获取该字段的方法,,并将获得的字段内容赋给OpDescription对象中对应SQL语句,直到 所有字段遍历完成。如果字段类型为布尔型,则获取该字段的方法名称为"Is+字段名()", 否则获取该字段的方法名称为"Get+字段名"。
例如如图4所示,遍历该对象中的字段构造CRUD操作的SQL语句并保存操作信息, 获取ManagerDAO的描述为"add"的OpDescription对象,遍历OpDescription对象 的字段名称以给SQL语句的字段内容赋值,本实施例中遍历至active字段,由于active是 布尔型变量,激活IsActive方法获取active的值。将得到的active的值bool利用JDBC 的setBoolean (bool)方法赋给OpDescription对象中的SQL语句。
步骤六执行步骤五中赋值完成OpDescription对象中的SQL语句,如果执行成功就 将结果返回至应用层,并关闭数据库连接;否则捕获并处理出现的异常,关闭与数据库连接 完成本次操作。
例如添加Manager操作的insert语句,经步骤五赋值完成,执行该SQL语句,若成 功为managerinfo表添加该条记录,则图书馆系统中增加了一位相应信息的管理员,返回至 应用层并关闭数据库连接。否则捕获并处理出现的异常,返回至应用层并关闭数据库连接。
权利要求
1、一种数据持久化实现方法,其特征在于,包括如下步骤步骤一根据具体的业务需求构建数据库,按照POJO构建与数据库表对应且字段名称一致的业务实体类,并配置数据库连接池;步骤二应用层根据统一访问接口向数据持久化层提出访问请求,接收到请求后,首先使用反射机制的类库获取访问请求中参数所属的业务实体类名,在配置文件中查找是否存在与该类名对应的数据访问类,若不存在则提示用户并退出操作,若存在加载并生成该数据访问类的一个实例;步骤三调用数据访问类实例中与提出的访问请求相一致的数据操作;首先判断对于该业务实体类进行CRUD操作的SQL语句是否保存在数据访问类中,若已保存在数据访问类中转步骤4;若没有则通过反射机制的类库动态获取业务实体类的字段名称与类型,构造对业务实体类进行CRUD的操作信息保存在数据访问类中;步骤四访问请求从数据访问类中遍历查找,取出与访问请求相应的操作信息;初始化数据库操作的条件,包括从数据库连接池中获取连接,建立操作语句和数据结果集;步骤五根据取出操作信息的字段名称及字段类型,获取各访问请求的字段名称对应的方法,并调用这些方法获取相应的字段内容值,将获得的值赋给对应操作信息中的SQL语句;步骤六执行操作信息中的SQL语句,如果执行成功,则将结果返回至应用层,并关闭数据库连接;否则,捕获并处理异常信息,再关闭数据库的连接。
2、 根据权利要求l所述一种数据持久化实现方法,其特征在于所述步骤二中,业务实体类 与数据访问类的配置文件采用XML文件的形式,每条记录包括业务实体类的名称和该类相应 的数据访问类的名称。
3、 根据权利要求l所述一种数据持久化实现方法,其特征在于所述步骤三中采用反射机制 的类库动态获取业务实体类的字段名称和字段类型,这些信息用来构造CRUD数据操作的 SQL语句,使用自定义的数据结构保存CRUD操作的含义,包含的信息有操作的描述、操 作的SQL语句、SQL语句的字段名称及字段类型;SQL语句的字段名称及字段类型采用键值 对的形式保存。
4、 根据权利要求l所述一种数据持久化实现方法,其特征在于所述步骤五中获取各访问请 求的字段名称对应的方法时,按操作信息中SQL字段名称的顺序依次利用反射机制的类库激 活访问请求参数中该字段所对应的方法;如果字段类型为布尔型,则获取该字段的方法名称 为"Is+字段名()",否则获取该字段的方法名称为"Get+字段名()",并将获得的字段内容 赋给操作信息中的对应SQL语句。
全文摘要
本发明提供了一种数据持久化实现方法。在数据库中构建与业务实体类对应的表,使用反射类库API获取业务实体类的字段信息,从而构造相应的SQL语句,实例化应用层所传递参数相应的数据访问类,并使用反射类库激活参数中的获取方法后,将字段的值赋给相应的SQL语句,执行后完成调用。本方法使得对于数据的持久化操作可以自适应对象数据模型和关系数据模型的变化,使得不再需要大量的配置文件来维护对象数据模型与关系数据模型之间的映射。本方法提供了统一的数据访问接口,不需绑定具体的业务逻辑和数据方案,可以在其他系统中复用,从而提高了持久层的开发效率,实现数据逻辑和业务逻辑的有效分离,提高系统的可扩展性。
文档编号G06F17/30GK101339559SQ20081011686
公开日2009年1月7日 申请日期2008年7月18日 优先权日2008年7月18日
发明者丹 余, 钢 叶, 帆 徐, 李先军, 马世龙 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1